سطح مقدماتی (Beginner Level)
پایتون به صورت پیشفرض دارای یک کتابخانه قدرتمند برای کار با پایگاه داده رابطهای (Relational Database) به نام sqlite3 است. برخلاف MySQL یا PostgreSQL، این دیتابیس نیاز به سرور جداگانه ندارد و کل دیتابیس در یک فایل ذخیره میشود.
۱. اتصال و ایجاد دیتابیس (Connection & Cursor)
برای کار با دیتابیس، ابتدا باید به آن متصل شویم (Connection) و سپس یک "نشانگر" (Cursor) برای اجرای دستورات بسازیم.
مثال ۱: ایجاد دیتابیس در حافظه (RAM)
استفاده از :memory: باعث میشود دیتابیس فقط تا زمانی که برنامه در حال اجراست وجود داشته باشد (مناسب برای تست).
مثال ۲: ساختار استاندارد با Cursor
در این مثال روش صحیح ساخت نشانگر برای اجرای دستورات را میبینیم.
import sqlite3
# اگر فایل وجود نداشته باشد، ساخته میشود
connection = sqlite3.connect('my_database.db')
cursor = connection.cursor()
# اینجا دستورات اجرا میشوند
# cursor.execute(...)
connection.close()
۲. ساخت جدول (CREATE TABLE)
برای ذخیره دادهها باید ساختار جدول را با دستورات SQL تعریف کنیم.
مثال ۱: ساخت جدول کاربران
۳. درج و خواندن دادهها (INSERT & SELECT)
پس از ساخت جدول، با دستور INSERT داده وارد میکنیم و با SELECT آنها را میخوانیم. نکته مهم دستور commit() است که تغییرات را نهایی میکند.
مثال ۱: درج یک رکورد و خواندن آن
مثال ۲: درج چندین رکورد همزمان (executemany)
سطح پیشرفته (Professional Level)
در پروژههای واقعی، مدیریت صحیح منابع، امنیت در برابر هک (SQL Injection) و مدیریت نوع دادهها اهمیت حیاتی دارد.
۱. استفاده از Context Managers (with)
برای جلوگیری از باز ماندن کانکشنها در صورت بروز خطا، همیشه از دستور with استفاده کنید. این کار به صورت خودکار close() را صدا میزند.
مثال ۱: مدیریت خودکار اتصال
۲. امنیت و Parameterized Queries
خطرناک: هرگز رشتههای پایتون را مستقیماً در کوئری SQL نگذارید (f-string). این کار باعث حفره امنیتی SQL Injection میشود.
امن: همیشه از علامت سوال ? یا نامگذاری :name استفاده کنید تا کتابخانه ورودیها را پاکسازی (Sanitize) کند.
مثال ۱: روش ناامن (هرگز استفاده نکنید)
# Static code demonstrating BAD practice
user_input = "Ali'; DROP TABLE users; --"
# این دستور کل جدول را پاک میکند!
query = f"SELECT * FROM users WHERE name = '{user_input}'"
مثال ۲: روش ایمن (Parameterized)
۳. مدیریت خروجیها (Row Factory)
به صورت پیشفرض، sqlite3 نتایج را به صورت تاپل برمیگرداند. برای دسترسی راحتتر (مانند دیکشنری)، میتوانیم row_factory را تغییر دهیم.
مثال ۱: تبدیل خروجی به دیکشنری
۴. مدیریت تراکنشها (Transactions)
تراکنشها تضمین میکنند که یا تمام عملیات انجام شود، یا هیچکدام (Atomic). اگر خطایی رخ دهد، میتوان با rollback() به حالت قبل برگشت.