📦 فصل ۱۸: پایگاه داده و ذخیرهسازی دادهها با SQLite در پایتون

مقدمه: پایگاه داده یعنی چی و چرا لازم داریم؟
تصور کن اطلاعاتی مثل لیست کاربران، محصولات یا تراکنشها رو بخواهیم فقط با فایل متنی مدیریت کنیم:
- هر بار برای تغییر باید فایل رو کامل بازنویسی کنیم.
- جستجو خیلی کند میشه.
- پایداری و امنیت نسخهها نداره.
پایگاه داده (Database) این مشکلات رو حل میکنه. بزرگترین مزیتش:
- ساختارمند شدن دادهها (ردیف – ستون)
- جستجوی خیلی سریع
- ذخیره امن و با دسترسی همزمان
۱۸.۱ ماژول sqlite3 در پایتون – چرا و چطور؟
SQLite یک دیتابیس واقعی و کوچک است که نیازی به نصب یا کانفیگ سرور نداره. فایل دیتابیس خودش مثل یک فایل معمولی کنار پروژه ذخیره میشه.
sqlite3 از کتابخانههای استاندارد پایتونه یعنی با نصب پایتون خودش هست.
چطور شروع کنم؟
import sqlite3
با همین خط، آماده کار با پایگاه داده هستی!
۱۸.۲ ساخت دیتابیس و اتصال به آن
هر دیتابیس SQLite یک فایل روی دیسکه.
مثلاً mydb.db پایگاه داده توست.
ایجاد فایل دیتابیس و گرفتن cursor
conn = sqlite3.connect('mydb.db') # اگر فایل نباشه، ساخته میشه
cursor = conn.cursor() # واسطه اجرای دستورات SQL
⏳ توجه: اگر چند بار همین اسم رو connect بزنی همون دیتابیس رو باز میکنی.
۱۸.۳ ساخت جدول (Table)؛ معرفی دستور CREATE TABLE
هر دیتابیس میتونه چند تا جدول داشته باشه (مثل شیتهای اکسل).
برای ساخت جدول «کاربران» با ستونهای id، name، age، email:
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT, # شناسه منحصر به فرد خودکار
name TEXT NOT NULL, # نام اجباری متنی
age INTEGER, # سن عددی
email TEXT UNIQUE # ایمیل یکتا
)
""")
conn.commit() # تا اینجای کار، دیتابیس ذخیره کن!
| id | name | age | |
|---|---|---|---|
| 1 | علی | 30 | ali@example.com |
| 2 | مریم | 23 | maryam@x.com |
۱۸.۴ افزودن رکورد (Insert): داده اضافه کن
برای اضافه کردن هر کاربر:
cursor.execute(
"INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
("علی", 30, "ali@example.com")
)
conn.commit()
توضیح: علامت سؤالها جای مقادیر قرار میگیرند (هم ایمن هم راحتتر).
۱۸.۵ خواندن دادهها (انتخاب یا Select)
برای دیدن تمام کاربران:
cursor.execute('SELECT * FROM users')
users = cursor.fetchall()
for user in users:
print(user)
# خروجی: (1, 'علی', 30, 'ali@example.com')
توضیح: .fetchall() همه نتایج رو به صورت لیست برمیگردونه.
۱۸.۶ فیلتر و جستجو (Where)
مثلاً میخواهیم کاربران بالاتر از ۲۴ سال را پیدا کنیم:
cursor.execute('SELECT name, email FROM users WHERE age > ?', (24,))
results = cursor.fetchall()
print(results)
۱۸.۷ ویرایش و حذف رکورد
تغییر داده (Update)
cursor.execute(
"UPDATE users SET age = ? WHERE name = ?",
(31, "علی")
)
conn.commit()
حذف داده (Delete)
cursor.execute(
"DELETE FROM users WHERE name = ?",
("علی",)
)
conn.commit()
۱۸.۸ امنیت و نکات پایانی
- استفاده از ? در کوئریها باعث میشه خطر حمله SQL Injection نداشته باشیم.
- روی همه تغییرات از
conn.commit()استفاده کن تا ذخیره شونده. - آخر کار، دیتابیس رو ببند:
conn.close()
۱۸.۹ پروژه کوچیک: ثبت و مشاهده کاربران
همه مراحل رو یکجا:
import sqlite3
def create_db():
conn = sqlite3.connect("users.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
)
""")
conn.commit()
conn.close()
def add_user(name, age, email):
conn = sqlite3.connect("users.db")
cursor = conn.cursor()
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", (name, age, email))
conn.commit()
conn.close()
def show_users():
conn = sqlite3.connect("users.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
for row in cursor.fetchall():
print(row)
conn.close()
# نمونه استفاده:
create_db()
add_user("سارا", 26, "sara@example.com")
add_user("محمد", 21, "mohammad@x.com")
show_users()
خودت کد را تست کن و کاربر جدید اضافه کن!
تمرین پیشنهادی
۱. تابعی بنویس که با گرفتن ایمیل کاربر، اطلاعاتش را نمایش دهد.
۲. تابع حذف کاربر بساز.
نکته حرفهای:
اگر پروژه بزرگ شد، یک ORM مثل SQLAlchemy ارزش استفاده داره.