کتابخانه sqlite3 در پایتون
در زبان برنامهنویسی پایتون، کتابخانه sqlite3 یکی از ابزارهای قدرتمند و داخلی برای کار با پایگاهدادههای رابطهای سبک است. این کتابخانه به صورت پیشفرض در پایتون نصب شده و نیاز به هیچ ماژول خارجی ندارد. SQLite یک سیستم مدیریت پایگاهداده (DBMS) بدون سرور است که دادهها را در یک فایل واحد ذخیره میکند، و به همین دلیل برای پروژههای کوچک تا متوسط یا برای نمونهسازی سریع بسیار مناسب است.
مقدمهای بر SQLite و مزایای استفاده از آن
SQLite یک پایگاهداده سبک و پرکاربرد است که در بسیاری از نرمافزارها، مرورگرها و حتی اپلیکیشنهای موبایل استفاده میشود. این پایگاهداده نیازی به سرور مجزا ندارد، و دادهها را در یک فایل ذخیره میکند که با پسوند .db یا .sqlite شناخته میشود.
مزایای استفاده از SQLite
- نصب ساده و بدون نیاز به پیکربندی خاص.
- سبک و سریع برای پروژههای کوچک و متوسط.
- پشتیبانی مستقیم در پایتون از طریق کتابخانه
sqlite3. - سازگاری با زبان SQL برای ایجاد، ویرایش و جستجو در دادهها.
- قابل استفاده در اپلیکیشنهای دسکتاپ، موبایل و وب.
نحوه استفاده از کتابخانه sqlite3 در پایتون
اتصال به پایگاهداده
اولین گام برای کار با sqlite3، ایجاد یا اتصال به یک فایل پایگاهداده است. اگر فایل وجود نداشته باشد، پایتون به طور خودکار آن را ایجاد میکند:
import sqlite3
# اتصال به پایگاهداده
connection = sqlite3.connect("my_database.db")
# ایجاد یک شی cursor برای اجرای دستورات SQL
cursor = connection.cursor()
در این کد، تابع sqlite3.connect() فایل پایگاهداده را باز میکند یا میسازد. شی cursor به ما اجازه میدهد دستورات SQL را اجرا کنیم. استفاده از نام فایل :memory: باعث میشود پایگاهداده در حافظه (RAM) ایجاد شود و پس از پایان برنامه از بین برود.
ایجاد جدول در پایگاهداده
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL
)
""")
connection.commit()
در این مثال، یک جدول به نام users ساخته شده است که سه ستون دارد: شناسه، نام و ایمیل. کلید اصلی به صورت خودکار مقداردهی میشود. دستور commit() برای ذخیره تغییرات در فایل پایگاهداده الزامی است.
افزودن داده به جدول
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", ("Ali", "ali@example.com"))
connection.commit()
استفاده از علامت سؤال (?) در کوئری باعث جلوگیری از حملات SQL Injection میشود. این روش جایگزینی دادهها را به صورت امن انجام میدهد.
افزودن چند رکورد با روش بهینهتر
users = [
("Sara", "sara@example.com"),
("Reza", "reza@example.com"),
("Mina", "mina@example.com")
]
cursor.executemany("INSERT INTO users (name, email) VALUES (?, ?)", users)
connection.commit()
تابع executemany() برای افزودن چندین رکورد بهصورت همزمان استفاده میشود که کارایی بالاتری نسبت به اجرای جداگانه دارد.
بازیابی دادهها از پایگاهداده
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)
تابع fetchall() تمام نتایج کوئری را بهصورت لیست از تاپلها برمیگرداند. هر تاپل یک سطر از جدول است. برای کوئریهای بزرگتر، استفاده از fetchone() یا حلقهی مستقیم بر روی cursor توصیه میشود تا از مصرف زیاد حافظه جلوگیری شود.
جستجوی داده خاص
cursor.execute("SELECT * FROM users WHERE email = ?", ("ali@example.com",))
user = cursor.fetchone()
print(user)
در این کد، دادهی کاربری با ایمیل مشخص بازیابی میشود. استفاده از پارامترها به شکل تاپل در execute() از بروز خطاهای امنیتی جلوگیری میکند.
بهروزرسانی دادهها
cursor.execute("UPDATE users SET name = ? WHERE id = ?", ("Ali Reza", 1))
connection.commit()
دستور UPDATE برای تغییر مقدار فیلدهای خاص استفاده میشود. پس از اجرا، باید حتماً commit() انجام شود تا تغییرات ثبت شوند.
حذف دادهها
cursor.execute("DELETE FROM users WHERE id = ?", (2,))
connection.commit()
در این مثال، رکوردی با شناسه ۲ حذف میشود. حذف بدون شرط میتواند کل دادهها را از بین ببرد؛ بنابراین همیشه شرط مناسب در دستور WHERE ضروری است.
استفاده از Context Manager برای مدیریت خودکار اتصال
یکی از بهترین روشها برای مدیریت منابع در پایتون، استفاده از ساختار with است. این روش باعث میشود اتصال و cursor به طور خودکار بسته شوند:
import sqlite3
with sqlite3.connect("my_database.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
در این حالت نیازی به فراخوانی commit() یا close() به صورت دستی نیست، زیرا پایتون پس از خروج از بلوک with، به صورت خودکار عملیات پاکسازی را انجام میدهد.
مدیریت استثناها (Exception Handling)
برای افزایش پایداری کد، توصیه میشود عملیات پایگاهداده را در بلوک try-except قرار دهید:
try:
connection = sqlite3.connect("my_database.db")
cursor = connection.cursor()
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", ("Test", "test@example.com"))
connection.commit()
except sqlite3.Error as e:
print("Database error:", e)
finally:
connection.close()
در این ساختار، هرگونه خطا در اجرای کوئری یا اتصال به پایگاهداده توسط sqlite3.Error شناسایی و مدیریت میشود.
خواندن دادهها به صورت دیکشنری (Dictionary Cursor)
به طور پیشفرض، دادههای بازیابی شده از sqlite3 به صورت تاپل بازگردانده میشوند. اما میتوان با استفاده از تنظیم خاصی، دادهها را به صورت دیکشنری با کلیدهای ستونها دریافت کرد:
connection.row_factory = sqlite3.Row
cursor = connection.cursor()
cursor.execute("SELECT * FROM users")
for row in cursor.fetchall():
print(dict(row))
این روش در برنامههایی که نیاز به دادههای ساختاریافته دارند (مثلاً در APIها) بسیار مفید است.
مقایسه SQLite با سایر سیستمهای پایگاهداده
| ویژگی | SQLite | MySQL / PostgreSQL |
|---|---|---|
| نصب و راهاندازی | بدون نیاز به سرور، بسیار آسان | نیاز به نصب و پیکربندی سرور |
| کارایی | عالی برای پروژههای کوچک | بهتر برای پروژههای بزرگ و چندکاربره |
| قابلیت چندکاربره (Concurrent Access) | محدود | پشتیبانی کامل از تراکنشهای همزمان |
| پشتیبانی در پایتون | داخلی (Built-in) | نیاز به کتابخانه خارجی (مثل mysql.connector) |
بهترین شیوهها (Best Practices)
- همیشه از پارامترهای جایگزین (؟) برای جلوگیری از SQL Injection استفاده کنید.
- از Context Manager برای مدیریت خودکار اتصال بهره بگیرید.
- در هر عملیات مهم از بلوک
try-exceptاستفاده کنید. - قبل از اجرای پروژه واقعی، ساختار جداول و ایندکسها را بهینهسازی کنید.
- برای ذخیره فایلهای بزرگ یا باینری، از BLOB استفاده کنید اما با احتیاط.
نتیجهگیری فنی
کتابخانه sqlite3 در پایتون، ابزاری قدرتمند، ساده و امن برای مدیریت دادههاست. با استفاده از آن میتوان به راحتی برنامههایی ایجاد کرد که نیاز به ذخیره، جستجو و ویرایش دادهها دارند، بدون نیاز به نصب سرور جداگانه. با رعایت اصول امنیتی و بهترین شیوههای برنامهنویسی، SQLite میتواند یک انتخاب حرفهای و سریع برای بسیاری از پروژههای نرمافزاری باشد.
آیا این مطلب برای شما مفید بود ؟




