پایتون و پایگاه داده SQLite

دسته‌بندی: برنامه‌نویسی

آرش صمدی

ایجاد: شنبه 30 تیر 1403 18:28

بروزرسانی: پنج‌شنبه 25 مرداد 1403 03:07

SQLite یک پایگاه داده دیسک-پایه بوده که برای عملکرد به یک server process مجزا نیاز ندارد. این پایگاه داده در بسیاری از نرم‌افزارهای کوچک و بزرگ کاربرد داشته و مزایای بسیاری از جمله سهولت گرفتن نسخه پشتیبان، انعطاف بالا، سرعت مناسب و ... دارد. در این مقاله به یک آموزش مقدماتی از کار با sqlite پرداخته می‌شود.

این مقاله با فرض آشنایی مخاطب با syntax زبان SQL و مفاهیمی نظیر cursor و transaction اقدام به ایجاد یک پایگاه داده از چند سریال معروف می‌نماید. در این پایگاه داده امتیاز IMDB سریال و سال انتشار اولین فصل از آن ذخیره می‌گردد. برای آشنایی بیشتر با شیوه نوشتن دستورات در زبان SQL توصیه می‌شود حتما سری به سایت w3schools بزنید، فوق العاده است!

در گام اول نیاز است که یک پایگاه داده ایجاد شده و اتصال با آن برقرار شود. در نظر داریم تا نام پایگاه داده این مثال serial.db باشد و برای ایجاد اتصال با آن از دستور sqlite3.connect("serial.db") استفاده می‌شود. اگر پایگاه داده‌ای با این نام از قبل وجود داشته باشد، دستور مذکور یک اتصال با آن می‌سازد و در شرایطی که این پایگاه داده موجود نباشد، خود اقدام به ایجاد یک پایگاه داده جدید می‌نماید. 

import sqlite3

con = sqlite3.connect("serial.db")

با اجرای دستور بالا می‌توانید ببینید که فایل پایگاه داده ایجاد شده است. متغیر con در دستور بالا در واقع یک آبجکت اتصال به پایگاه داده است. برای آن که قادر به اجرای دستورات SQL باشیم به یک cursor برای پایگاه داده خود نیاز داریم. از همین رو برای ایجاد آبجکت Cursor از دستور زیر استفاده خواهد شد:

cur = con.cursor()

حال که یک پایگاه داده و یک cursor داریم، می‌توانیم برای پایگاه داده خود یک جدول با نام series ایجاد کنیم. این جدول ستون‌هایی برای ذخیره عنوان سریال، سال انتشار و امتیاز imdb خواهد داشت. به لطف flexible typing در SQLite، تعیین نوع داده‌ها اختیاری است. برای ایجاد جدول داریم:

cur.execute("CREATE TABLE series(title, year, imdb)")

با اجرای یک جستجو در sqlite_master می‌توان دید که آیا جدول بالا ساخته شده است یا خیر. اگر جدول ساخته شده باشد، نام آن (series) باید در نتیجه جستجو وجود داشته باشد. برای این کار نیز می‌بایست از cursor استفاده کرده و نتیجه در ابجکت res مقدار دهی شده و نتایج با استفاده از fetchone دیده شود:

>>> res = cur.execute("SELECT name FROM sqlite_master")

>>> res.fetchone()

('series',)

دیده می‌شود با اجرای دستور fetchone نام جدول series در یک tuple بازگردانده شده است. حال فرض کنید به دنبال یک جدول با نامی خاص هستیم، برای مثال جدولی با نام movies که در پایگاه داده ما اصلا وجود ندارد. در این صورت دستور مربوطه می‌بایست به صورت زیر اجرا گردد. در این صورت از آن جا که چنین جدولی در پایگاه داده وجود ندارد، یک None بازگردانده می‌شود.

>>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='movies'")

>>> res.fetchone() is None

True

حال نوبت به آن می‌رسد که دو سطر جدید از سریال‌هایمان را به جدول series از پایگاه داده اضافه کنیم. 

res = cur.execute("""

                INSERT INTO series VALUES

                    ('The Breaking Bad', 2008, 9.5),

                    ('Prison Break', 2005, 8.3)

""")

دستور INSERT در واقع باعث باز شدن یک تراکنش (transaction) می‌شود که قبل از هرچیزی می‌بایست commit گردد. برای این کار دستور زیر اجرا می‌گردد:

res.commit()

برای آن که بررسی کنیم که آیا اطلاعات سریال‌هایمان به درستی در پایگاه داده وارد شده است یا خیر با استفاده از دستور SELECT می‌توان اقدام به اجرای یک جستجو در داده‌های ذخیره شده در پایگاه داده نمود:

>>> res = cur.execute("SELECT imdb FROM series")

>>> res.fetchall()

[(9.5,), (8.3,)]

نتیجه یک لیست از دو tuple است که هر یک به ازای یکی از سطرهای جدول series از پایگاه داده است. پایتون یک امکان جالب برای اجرای چندین دستور SQL نیز دارد. در این کار از cur.executemany استفاده می‌شود. برای مثال در کد زیر چند سریال دیگر با استفاده از این دستور به پایگاه داده اضافه می‌شود:

data = [

    ("Walking Dead", 2010, 8.1),

    ("The Mandalorian", 2019, 8.6),

    ("24", 2001, 8.4),

]

cur.executemany("INSERT INTO series VALUES(?, ?, ?)", data)

con.commit()

حتما به‌یاد داشته باشید که در انتها از con.commit استفاده شود. در این دستور از ? استفاده شده تا اطلاعات موجود در لیست data به هر یک از علامت‌های ? تخصیص داده شود. برای بررسی این که آیا سریال‌های ما به درستی در پایگاه داده ذخیره شده است یا خیر:

توجه فرمایید که در قطعه کد بالا سریال‌ها بر اساس نمره imdb خود مرتب شده‌اند. هر یک از سطور print شده در تصویر بالا، یک tuple از داده‌های مربوط به ستون عنوان، سال و امتیاز imdb است.

در انتها نیز با استفاده از دستور con.close اتصال به پایگاه داده بسته می‌شود.

con.close()

منبع: ترجمه (با تغییر) از وبسایت python.org

ثبت نظر:



وبسایت Vδ

وی‌دلتا، مجموعه‌ای از مقالات، آموزش‌ها و مباحث حوزه برق و برنامه‌نویسی. برای اطلاع از انتشار مقالات حتما در کانال تلگرام ما عضو شوید.

آدرس کانال تلگرام

Channel ID: @vdelta_ir

آخرین مطالب

درباره نویسنده

آرش صمدی

دانشجوی دکتری مهندسی برق قدرت و علاقه‌مند به مباحث حوزه برنامه‌نویسی کاربردی در صنعت برق. زمینه‌های تخصصی: حفاظت سیستم‌های قدرت، ارتینگ و توسعه نرم‌افزارهای حوزه مهندسی برق

سایر مقالات درباره نویسنده