SQLite یکی از محبوب ترین سیستم های مدیریت پایگاه داده رابطه ای (RDBMS) است. سبک وزن است، به این معنی که فضای زیادی را اشغال نمی کند روی سیستم شما یکی از بهترین ویژگی های آن این است که بدون سرور است، بنابراین برای استفاده از آن نیازی به نصب یا مدیریت سرور جداگانه ندارید.

در عوض، همه چیز را در یک فایل ساده ذخیره می کند روی کامپیوتر شما همچنین به پیکربندی صفر نیاز دارد، بنابراین تنظیمات پیچیده ای وجود ندارد process، آن را برای مبتدیان و پروژه های کوچک عالی می کند.

SQLite یک انتخاب عالی برای برنامه های کوچک تا متوسط ​​است زیرا استفاده از آن آسان، سریع است و می تواند اکثر وظایفی را که پایگاه های داده بزرگتر می توانند انجام دهند، انجام دهد، اما بدون دردسر مدیریت نرم افزار اضافی. چه در حال ساخت یک پروژه شخصی یا نمونه سازی یک برنامه جدید باشید، SQLite یک گزینه قوی برای راه اندازی و اجرای سریع کارها است.

در این آموزش، روش کار با SQLite با استفاده از پایتون را خواهید آموخت. در اینجا چیزی است که ما قصد داریم در این آموزش پوشش دهیم:

  • روش تنظیم محیط پایتون

  • چگونه یک پایگاه داده SQLite ایجاد کنیم

  • روش ایجاد جداول پایگاه داده

  • روش درج داده ها در یک جدول

  • روش استعلام داده ها

  • روش به روز رسانی و حذف داده ها

  • روش استفاده از معاملات

  • روش بهینه سازی عملکرد SQLite Query با نمایه سازی

  • روش رسیدگی به خطاها و استثناها

  • روش صادرات و واردات داده ها [Bonus Section]

  • بسته بندی

این آموزش برای هرکسی که می‌خواهد با پایگاه‌های داده بدون غواصی در تنظیمات پیچیده شروع کند عالی است.

روش تنظیم محیط پایتون

قبل از کار با SQLite، بیایید مطمئن شویم که محیط پایتون شما آماده است. در اینجا روش تنظیم همه چیز آمده است.

نصب پایتون

اگر پایتون را نصب نکرده اید روی هنوز سیستم شما، شما می توانید آن را از وب سایت رسمی پایتون دانلود کنید. دستورالعمل های نصب سیستم عامل خود (ویندوز، macOS یا لینوکس) را دنبال کنید.

برای بررسی اینکه آیا پایتون نصب شده است، برنامه خود را باز کنید terminal (یا خط فرمان) و تایپ کنید:

python --version

این باید نسخه فعلی پایتون نصب شده را نشان دهد. اگر نصب نیست، دستورالعمل ها را دنبال کنید روی وب سایت پایتون

نصب ماژول SQLite3

خبر خوب این است که SQLite3 به صورت داخلی با پایتون عرضه می شود! نیازی به نصب جداگانه آن ندارید زیرا در کتابخانه استاندارد پایتون گنجانده شده است. این بدان معنی است که می توانید بلافاصله بدون هیچ گونه تنظیمات اضافی استفاده از آن را شروع کنید.

ایده خوبی است که برای هر پروژه یک محیط مجازی ایجاد کنید تا وابستگی های خود را سازماندهی کنید. یک محیط مجازی مانند یک لوح تمیز است که می توانید بسته ها را بدون تأثیر بر نصب جهانی پایتون خود نصب کنید.

برای ایجاد یک محیط مجازی مراحل زیر را دنبال کنید:

  1. ابتدا خود را باز کنید terminal یا خط فرمان و به دایرکتوری که می خواهید پروژه خود را ایجاد کنید بروید.

  2. برای ایجاد یک محیط مجازی دستور زیر را اجرا کنید:

python -m venv env

اینجا، env نام محیط مجازی است. شما می توانید آن را هر چیزی که دوست دارید نامگذاری کنید.

  1. فعال کردن محیط مجازی:
# Use the command for Windows
env\Scripts\activate

# Use the command for macOS/Linux:
env/bin/activate

پس از فعال سازی محیط مجازی، متوجه خواهید شد که terminal تغییرات سریع، نشان دادن نام محیط مجازی. این بدان معنی است که شما اکنون در داخل آن کار می کنید.

نصب کتابخانه های ضروری

برای این پروژه به چند کتابخانه اضافی نیاز داریم. به طور خاص، ما استفاده خواهیم کرد:

  • pandas: این یک کتابخانه اختیاری برای مدیریت و نمایش داده ها در قالب جدول است که برای موارد استفاده پیشرفته مفید است.

  • faker: این کتابخانه به ما کمک می‌کند تا داده‌های جعلی مانند نام‌ها و آدرس‌های تصادفی تولید کنیم که می‌توانیم آن‌ها را برای آزمایش در پایگاه داده خود وارد کنیم.

برای نصب pandas و faker، به سادگی دستورات زیر را اجرا کنید:

pip install pandas faker

این هر دو را نصب می کند pandas و faker وارد محیط مجازی شما شود با این کار، محیط شما راه‌اندازی می‌شود و شما آماده‌اید تا شروع به ایجاد و مدیریت پایگاه داده SQLite خود در پایتون کنید!

روش ایجاد یک پایگاه داده SQLite

پایگاه داده روشی ساختاریافته برای ذخیره و مدیریت داده ها است تا بتوان به راحتی به آنها دسترسی پیدا کرد، به روز رسانی کرد و سازماندهی کرد. این مانند یک سیستم بایگانی دیجیتال است که به شما امکان می دهد تا به طور موثر مقادیر زیادی از داده ها را ذخیره کنید، چه برای یک برنامه ساده یا یک سیستم پیچیده تر. پایگاه‌های داده از جداول برای سازماندهی داده‌ها استفاده می‌کنند که ردیف‌ها و ستون‌ها نشان‌دهنده رکوردهای فردی و ویژگی‌های آن‌ها هستند.

روش کار پایگاه های داده SQLite

برخلاف اکثر سیستم های پایگاه داده دیگر، SQLite یک پایگاه داده بدون سرور است. این بدان معناست که نیازی به راه‌اندازی یا مدیریت سرور ندارد و همین امر باعث می‌شود آن را سبک وزن و استفاده کنید. تمام داده ها در یک فایل ذخیره می شوند روی رایانه شما، که می توانید به راحتی آن را جابجا کنید، به اشتراک بگذارید یا از آن نسخه پشتیبان تهیه کنید. با وجود سادگی، SQLite به اندازه کافی قدرتمند است تا بتواند بسیاری از وظایف رایج پایگاه داده را انجام دهد و به طور گسترده در برنامه های تلفن همراه، سیستم های جاسازی شده و پروژه های کوچک تا متوسط ​​استفاده می شود.

روش ایجاد یک پایگاه داده SQLite جدید

بیایید یک پایگاه داده جدید SQLite ایجاد کنیم و روش تعامل با آن را با استفاده از Python یاد بگیریم sqlite3 کتابخانه

اتصال به پایگاه داده

از آنجایی که sqlite3 از قبل نصب شده است، شما فقط نیاز دارید import آن را در اسکریپت پایتون شما. برای ایجاد یک پایگاه داده جدید یا اتصال به پایگاه داده موجود، از sqlite3.connect() روش این روش نام فایل پایگاه داده را به عنوان آرگومان می گیرد. اگر فایل وجود نداشته باشد، SQLite به طور خودکار آن را ایجاد می کند.

import sqlite3

# Connect to the SQLite database (or create it if it doesn't exist)
connection = sqlite3.connect('my_database.db')

در این مثال، فایلی به نام my_database.db در همان دایرکتوری اسکریپت شما ایجاد می شود. اگر فایل از قبل وجود داشته باشد، SQLite فقط اتصال به آن را باز می کند.

ایجاد مکان نما

هنگامی که اتصال برقرار کردید، مرحله بعدی ایجاد یک شی مکان نما است. مکان نما مسئول اجرای دستورات و پرس و جوهای SQL است روی پایگاه داده

# Create a cursor object
cursor = connection.cursor()

بستن اتصال

پس از پایان کار با پایگاه داده، مهم است که اتصال را ببندید تا منابع آزاد شوند. با دستور زیر می توانید اتصال را ببندید:

# Close the database connection
connection.close()

با این حال، فقط زمانی باید اتصال را ببندید که تمام عملیات خود را تمام کنید.

هنگامی که اسکریپت پایتون خود را اجرا می کنید، یک فایل به نام my_database.db در فهرست کاری فعلی شما ایجاد خواهد شد. شما اکنون با موفقیت اولین پایگاه داده SQLite خود را ایجاد کرده اید!

روش استفاده از Context Manager برای باز و بسته کردن اتصالات

پایتون یک راه کارآمدتر و تمیزتر برای مدیریت اتصالات پایگاه داده با استفاده از with بیانیه که به عنوان مدیر زمینه نیز شناخته می شود. این with بیانیه به طور خودکار اتصال را باز و بسته می کند و اطمینان حاصل می کند که اتصال به درستی بسته شده است حتی اگر در طول عملیات پایگاه داده خطایی رخ دهد. با این کار نیازی به تماس دستی نیست connection.close().

در اینجا روش استفاده از آن آورده شده است with بیانیه ای برای مدیریت اتصالات پایگاه داده:

import sqlite3

# Step 1: Use 'with' to connect to the database (or create one) and automatically close it when done
with sqlite3.connect('my_database.db') as connection:

    # Step 2: Create a cursor object to interact with the database
    cursor = connection.cursor()

    print("Database created and connected successfully!")

# No need to call connection.close(); it's done automatically!

از هم اکنون روی، ما از with بیانیه در نمونه کدهای آینده ما برای مدیریت موثر اتصالات پایگاه داده. این باعث می شود کد مختصرتر و نگهداری آسان تر شود.

روش ایجاد جداول پایگاه داده

اکنون که یک پایگاه داده SQLite ایجاد کرده ایم و به آن متصل شده ایم، مرحله بعدی ایجاد جداول در داخل پایگاه داده است. جدول جایی است که ما داده های خود را در ردیف ها (سوابق) و ستون ها (ویژگی ها) سازماندهی می کنیم. برای این مثال، جدولی به نام ایجاد می کنیم Students برای ذخیره اطلاعات دانش‌آموزان، که در بخش‌های آینده دوباره از آن‌ها استفاده خواهیم کرد.

برای ایجاد جدول از SQL استفاده می کنیم CREATE TABLE بیانیه این دستور ساختار جدول را شامل نام ستون ها و انواع داده ها برای هر ستون تعریف می کند.

در اینجا یک دستور SQL ساده برای ایجاد a وجود دارد Students جدول با فیلدهای زیر:

  • id: یک شناسه منحصر به فرد برای هر دانش آموز (یک عدد صحیح).

  • نام: نام دانش آموز (متن).

  • سن: سن دانش آموز (یک عدد صحیح).

  • ایمیل: آدرس ایمیل دانش آموز (متن).

دستور SQL برای ایجاد این جدول به شکل زیر است:

CREATE TABLE Students (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    email TEXT
);

ما می توانیم این را اجرا کنیم CREATE TABLE دستور SQL در پایتون با استفاده از sqlite3 کتابخانه بیایید ببینیم چگونه این کار را انجام دهیم.

import sqlite3

# Use 'with' to connect to the SQLite database and automatically close the connection when done
with sqlite3.connect('my_database.db') as connection:

    # Create a cursor object
    cursor = connection.cursor()

    # Write the SQL command to create the Students table
    create_table_query = '''
    CREATE TABLE IF NOT EXISTS Students (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT
    );
    '''

    # Execute the SQL command
    cursor.execute(create_table_query)

    # Commit the changes
    connection.commit()

    # Print a confirmation message
    print("Table 'Students' created successfully!")
  • IF NOT EXISTS: این تضمین می کند که جدول فقط در صورتی ایجاد می شود که قبلاً وجود نداشته باشد، در صورتی که جدول قبلاً ایجاد شده باشد از بروز خطا جلوگیری می کند.

  • connection.commit(): این تغییرات را در پایگاه داده ذخیره می کند (متعهد می کند).

وقتی کد پایتون بالا را اجرا می کنید، کد را ایجاد می کند Students جدول در my_database.db فایل پایگاه داده همچنین پیامی را در قسمت مشاهده خواهید کرد terminal تأیید اینکه جدول با موفقیت ایجاد شده است.

اگر استفاده می کنید Visual Studio Code، می توانید پسوند SQLite Viewer را برای مشاهده پایگاه داده های SQLite نصب کنید.

SQLite Viewer - VS Code پسوند

انواع داده ها در SQLite و نگاشت آنها به پایتون

SQLite از چندین نوع داده پشتیبانی می کند که باید هنگام تعریف جداول خود آنها را درک کنیم. در اینجا یک مرور سریع از انواع داده های رایج SQLite و روش نگاشت آنها به انواع پایتون آورده شده است:

نوع داده SQLite توضیحات معادل پایتون
عدد صحیح اعداد کامل int
TEXT رشته های متنی str
واقعی اعداد ممیز شناور float
لکه داده های باینری (به عنوان مثال، تصاویر، فایل ها) bytes
NULL هیچ مقدار یا داده ای از دست رفته را نشان نمی دهد None

در ما Students جدول:

  • id از نوع است INTEGER، که به پایتون نگاشت می شود int.

  • name و email از نوع هستند TEXT، که نقشه آن به پایتون است str.

  • age نیز از نوع است INTEGER، نگاشت به پایتون int.

روش درج داده ها در یک جدول

حالا که ما خودمان را داریم Students جدول ایجاد شده، زمان آن رسیده است که داده ها را در پایگاه داده وارد کنید. در این بخش، روش درج رکوردهای منفرد و چندگانه با استفاده از Python و SQLite و روش جلوگیری از مسائل امنیتی رایج مانند تزریق SQL با استفاده از پرس و جوهای پارامتری را توضیح خواهیم داد.

روش درج یک رکورد

برای درج داده ها در پایگاه داده، از عبارت استفاده می کنیم INSERT INTO دستور SQL. بیایید با درج یک رکورد در خود شروع کنیم Students جدول

در اینجا نحو اصلی SQL برای درج یک رکورد منفرد آمده است:

INSERT INTO Students (name, age, email) 
VALUES ('John Doe', 20, 'johndoe@example.com');

با این حال، به جای اینکه SQL را مستقیماً در اسکریپت پایتون با مقادیر کدگذاری شده بنویسیم، از کوئری های پارامتری برای ایمن تر و انعطاف پذیرتر کردن کد خود استفاده می کنیم. پرس و جوهای پارامتری به جلوگیری از تزریق SQL کمک می کند، یک حمله رایج که در آن کاربران مخرب می توانند با ارسال ورودی های مضر، کوئری SQL را دستکاری کنند.

در اینجا روش درج یک رکورد در آن آمده است Students جدول با استفاده از یک پرس و جو پارامتری:

import sqlite3

# Use 'with' to open and close the connection automatically
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # Insert a record into the Students table
    insert_query = '''
    INSERT INTO Students (name, age, email) 
    VALUES (?, ?, ?);
    '''
    student_data = ('Jane Doe', 23, 'jane@example.com')

    cursor.execute(insert_query, student_data)

    # Commit the changes automatically
    connection.commit()

    # No need to call connection.close(); it's done automatically!
    print("Record inserted successfully!")

این ? مکان‌نماها مقادیری را نشان می‌دهند که باید در جدول درج شوند. مقادیر واقعی به صورت یک تاپل ارسال می شوند (student_data) در cursor.execute() روش

روش درج چندین رکورد

اگر می خواهید چندین رکورد را همزمان وارد کنید، می توانید از آن استفاده کنید executemany() روش در پایتون این روش فهرستی از تاپل ها را می گیرد که هر تاپل نشان دهنده یک رکورد است.

برای اینکه مثال خود را پویاتر کنیم، می توانیم از آن استفاده کنیم Faker کتابخانه ای برای تولید داده های تصادفی دانش آموزان این برای آزمایش و شبیه سازی سناریوهای دنیای واقعی مفید است.

from faker import Faker
import sqlite3

# Initialize Faker
fake = Faker(['en_IN'])

# Use 'with' to open and close the connection automatically
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # Insert a record into the Students table
    insert_query = '''
    INSERT INTO Students (name, age, email) 
    VALUES (?, ?, ?);
    '''
    students_data = [(fake.name(), fake.random_int(
        min=18, max=25), fake.email()) for _ in range(5)]

    # Execute the query for multiple records
    cursor.executemany(insert_query, students_data)

    # Commit the changes
    connection.commit()

    # Print confirmation message
    print("Fake student records inserted successfully!")

در این کد:

  • Faker() نام‌ها، سن‌ها و ایمیل‌های تصادفی را برای دانش‌آموزان تولید می‌کند. عبور از منطقه ([‘en_IN’]) اختیاری است.

  • cursor.executemany(): این روش به ما امکان می دهد چندین رکورد را همزمان وارد کنیم و کد را کارآمدتر می کند.

  • students_data: لیستی از تاپل ها که هر تاپل نشان دهنده داده های یک دانش آموز است.

روش رسیدگی به مسائل رایج: تزریق SQL

تزریق SQL یک آسیب پذیری امنیتی است که در آن مهاجمان می توانند پرس و جوهای SQL را با ارائه ورودی مضر وارد یا دستکاری کنند. به عنوان مثال، یک مهاجم ممکن است سعی کند کدی مانند تزریق کند '; DROP TABLE Students; -- برای حذف جدول

پیشنهاد می‌کنیم بخوانید:  استفاده از Mocks برای تست در جاوا اسکریپت با Sinon.jsTest "mocks" اشیایی هستند که جایگزین اشیاء واقعی می شوند در حالی که عملکرد آنها را شبیه سازی می کنند. یک mock همچنین انتظاراتی در مورد روش استفاده از توابع مورد آزمایش دارد. در برخی از موارد تست واحد ممکن است بخواهیم عملکرد جاسوس ها را ترکیب کنیم، رفتار یک روش تحت فراخوانی را مشاهده کنیم، و...

با استفاده از پرس و جوهای پارامتری (همانطور که در بالا نشان داده شد)، از این مشکل جلوگیری می کنیم. این ? نگهدارنده‌های مکان در کوئری‌های پارامتری اطمینان می‌دهند که مقادیر ورودی به عنوان داده در نظر گرفته می‌شوند، نه به عنوان بخشی از دستور SQL. این امر اجرای کدهای مخرب را غیرممکن می کند.

روش استعلام داده ها

اکنون که برخی از داده ها را در خود قرار داده ایم Students جدول، بیایید یاد بگیریم که چگونه داده ها را از جدول بازیابی کنیم. ما روش های مختلف برای واکشی داده ها در پایتون را بررسی خواهیم کرد، از جمله fetchone()، fetchall()، و fetchmany().

برای پرس و جو داده ها از یک جدول، از عبارت استفاده می کنیم SELECT بیانیه در اینجا یک دستور ساده SQL برای انتخاب تمام ستون ها از آن وجود دارد Students جدول:

SELECT * FROM Students;

این دستور تمام رکوردها و ستون ها را از Students جدول ما می توانیم این را اجرا کنیم SELECT در پایتون پرس و جو کنید و نتایج را واکشی کنید.

روش واکشی همه رکوردها

در اینجا روش واکشی همه رکوردها از Students جدول:

import sqlite3

# Use 'with' to connect to the SQLite database
with sqlite3.connect('my_database.db') as connection:

    # Create a cursor object
    cursor = connection.cursor()

    # Write the SQL command to select all records from the Students table
    select_query = "SELECT * FROM Students;"

    # Execute the SQL command
    cursor.execute(select_query)

    # Fetch all records
    all_students = cursor.fetchall()

    # Display results in the terminal
    print("All Students:")
    for student in all_students:
        print(student)

در این مثال، fetchall() متد تمام سطرهای برگشتی توسط پرس و جو را به صورت لیستی از تاپل ها بازیابی می کند.

All Students:
(1, 'Jane Doe', 23, 'jane@example.com')
(2, 'Bahadurjit Sabharwal', 18, 'tristanupadhyay@example.net')
(3, 'Zayyan Arya', 20, 'yashawinibhakta@example.org')
(4, 'Hemani Shukla', 18, 'gaurikanarula@example.com')
(5, 'Warda Kara', 20, 'npatil@example.net')
(6, 'Mitali Nazareth', 19, 'sparekh@example.org')

روش واکشی یک رکورد

اگر می خواهید فقط یک رکورد را بازیابی کنید، می توانید از آن استفاده کنید fetchone() روش:

import sqlite3

# Use 'with' to connect to the SQLite database
with sqlite3.connect('my_database.db') as connection:

    # Create a cursor object
    cursor = connection.cursor()

    # Write the SQL command to select all records from the Students table
    select_query = "SELECT * FROM Students;"

    # Execute the SQL command
    cursor.execute(select_query)

    # Fetch one record
    student = cursor.fetchone()

    # Display the result
    print("First Student:")
    print(student)

خروجی:

First Student:
(1, 'Jane Doe', 23, 'jane@example.com')

روش واکشی چندین رکورد

برای واکشی تعداد مشخصی از رکوردها، می توانید استفاده کنید fetchmany(size):

import sqlite3

# Use 'with' to connect to the SQLite database
with sqlite3.connect('my_database.db') as connection:

    # Create a cursor object
    cursor = connection.cursor()

    # Write the SQL command to select all records from the Students table
    select_query = "SELECT * FROM Students;"

    # Execute the SQL command
    cursor.execute(select_query)

    # Fetch three records
    three_students = cursor.fetchmany(3)

    # Display results
    print("Three Students:")
    for student in three_students:
        print(student)

خروجی:

Three Students:
(1, 'Jane Doe', 23, 'jane@example.com')
(2, 'Bahadurjit Sabharwal', 18, 'tristanupadhyay@example.net')
(3, 'Zayyan Arya', 20, 'yashawinibhakta@example.org')

روش استفاده pandas برای ارائه بهتر داده ها

برای ارائه بهتر داده ها، می توانیم از pandas کتابخانه برای ایجاد یک DataFrame از نتایج پرس و جو ما این کار دستکاری و تجسم داده ها را آسان تر می کند.

در اینجا روش واکشی همه رکوردها و نمایش آنها به عنوان DataFrame پاندا آمده است:

import sqlite3
import pandas as pd

# Use 'with' to connect to the SQLite database
with sqlite3.connect('my_database.db') as connection:
    # Write the SQL command to select all records from the Students table
    select_query = "SELECT * FROM Students;"

    # Use pandas to read SQL query directly into a DataFrame
    df = pd.read_sql_query(select_query, connection)

# Display the DataFrame
print("All Students as DataFrame:")
print(df)

خروجی:

All Students as DataFrame:
   id                  name  age                        email
0   1              Jane Doe   23             jane@example.com
1   2  Bahadurjit Sabharwal   18  tristanupadhyay@example.net
2   3           Zayyan Arya   20  yashawinibhakta@example.org
3   4         Hemani Shukla   18    gaurikanarula@example.com
4   5            Warda Kara   20           npatil@example.net
5   6       Mitali Nazareth   19          sparekh@example.org

این pd.read_sql_query() تابع پرس و جوی SQL را اجرا می کند و نتایج را مستقیماً به عنوان DataFrame pandas برمی گرداند.

روش به روز رسانی و حذف داده ها

در این بخش، روش به روز رسانی رکوردهای موجود و حذف رکوردها از خود را یاد خواهیم گرفت Students جدول با استفاده از دستورات SQL در پایتون. این برای مدیریت و نگهداری موثر داده های شما ضروری است.

به روز رسانی سوابق موجود

برای اصلاح رکوردهای موجود در پایگاه داده، از SQL استفاده می کنیم UPDATE فرمان این دستور به ما اجازه می دهد تا مقادیر ستون های خاص را در یک یا چند ردیف بر اساس تغییر دهیم روی یک شرط مشخص

به عنوان مثال، اگر بخواهیم سن دانش آموز را به روز کنیم، دستور SQL به شکل زیر خواهد بود:

UPDATE Students 
SET age = 21 
WHERE name = 'Jane Doe';

حالا بیایید کد پایتون بنویسیم تا سن دانش آموز خاصی را در ما به روز کنیم Students جدول

import sqlite3

# Use 'with' to connect to the SQLite database
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # SQL command to update a student's age
    update_query = '''
    UPDATE Students 
    SET age = ? 
    WHERE name = ?;
    '''

    # Data for the update
    new_age = 21
    student_name = 'Jane Doe'

    # Execute the SQL command with the data
    cursor.execute(update_query, (new_age, student_name))

    # Commit the changes to save the update
    connection.commit()

    # Print a confirmation message
    print(f"Updated age for {student_name} to {new_age}.")

در این مثال، از کوئری های پارامتری برای جلوگیری از تزریق SQL استفاده کردیم.

روش حذف رکوردها از جدول

برای حذف رکوردها از پایگاه داده، از SQL استفاده می کنیم DELETE فرمان این دستور به ما امکان می دهد یک یا چند ردیف را بر اساس حذف کنیم روی یک شرط مشخص

به عنوان مثال، اگر بخواهیم دانش آموزی به نام “جین دو” را حذف کنیم، دستور SQL به شکل زیر خواهد بود:

DELETE FROM Students 
WHERE name = 'Jane Doe';

بیایید کد پایتون بنویسیم تا دانش آموز خاصی را از ما حذف کنیم Students جدول با استفاده از with بیانیه

import sqlite3

# Use 'with' to connect to the SQLite database
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # SQL command to delete a student
    delete_query = '''
    DELETE FROM Students 
    WHERE name = ?;
    '''

    # Name of the student to be deleted
    student_name = 'Jane Doe'

    # Execute the SQL command with the data
    cursor.execute(delete_query, (student_name,))

    # Commit the changes to save the deletion
    connection.commit()

    # Print a confirmation message
    print(f"Deleted student record for {student_name}.")

ملاحظات مهم

  • شرایط: همیشه از WHERE بند هنگام به روز رسانی یا حذف رکوردها برای جلوگیری از تغییر یا حذف تمام ردیف های جدول. بدون الف WHERE بند، دستور بر هر ردیف در جدول تأثیر می گذارد.

    357089 ردیف Meme را تحت تأثیر قرار دادند

  • پشتیبان گیری: تمرین خوبی است که قبل از انجام به روز رسانی یا حذف، به خصوص در محیط های تولید، از پایگاه داده خود نسخه پشتیبان تهیه کنید.

روش استفاده از معاملات

تراکنش دنباله ای از یک یا چند عملیات SQL است که به عنوان یک واحد کار در نظر گرفته می شود. در زمینه یک پایگاه داده، یک تراکنش به شما این امکان را می دهد که چندین عملیات را انجام دهید که یا همه موفق هستند یا اصلاً هیچکدام. این تضمین می کند که پایگاه داده شما حتی در مواجهه با خطاها یا مسائل غیرمنتظره در وضعیت ثابتی باقی می ماند.

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

چرا از تراکنش ها استفاده کنیم؟

  1. اتمی: معاملات تضمین می کند که یک سری عملیات به عنوان یک واحد واحد در نظر گرفته می شود. اگر یکی از عملیات ها ناموفق باشد، هیچ یک از عملیات ها در پایگاه داده اعمال نمی شود.

  2. سازگاری: تراکنش ها با اطمینان از رعایت همه قوانین و محدودیت ها به حفظ یکپارچگی پایگاه داده کمک می کنند.

  3. انزوا: هر تراکنش مستقل از دیگران عمل می کند و از تداخل ناخواسته جلوگیری می کند.

  4. ماندگاری: پس از انجام یک تراکنش، تغییرات دائمی هستند، حتی در صورت خرابی سیستم.

چه زمانی از تراکنش ها استفاده کنیم؟

شما باید از تراکنش ها زمانی استفاده کنید که:

  • انجام چندین عملیات مرتبط که باید با هم موفق شوند یا شکست بخورند.

  • اصلاح داده های حیاتی که مستلزم سازگاری و یکپارچگی است.

  • کار با عملیاتی که به طور بالقوه ممکن است شکست بخورد، مانند تراکنش های مالی یا انتقال داده ها.

روش مدیریت تراکنش ها در پایتون

در SQLite، تراکنش ها با استفاده از مدیریت می شوند BEGIN، COMMIT، و ROLLBACK دستورات با این حال، هنگام استفاده از sqlite3 ماژول در پایتون، شما معمولا تراکنش ها را از طریق شی اتصال مدیریت می کنید.

شروع یک معامله

یک تراکنش به طور ضمنی زمانی شروع می شود که هر دستور SQL را اجرا می کنید. برای شروع صریح تراکنش، می توانید از BEGIN دستور:

cursor.execute("BEGIN;")

با این حال، معمولاً نیازی به شروع یک تراکنش به صورت دستی نیست، زیرا SQLite یک تراکنش را به طور خودکار هنگام اجرای دستور SQL شروع می کند.

روش انجام معامله

برای ذخیره تمام تغییرات ایجاد شده در طول تراکنش، از commit() روش این باعث می شود تمام تغییرات در پایگاه داده دائمی شود.

connection.commit()

ما قبلا استفاده کرده ایم commit() روش در مثال های ارائه شده در بالا.

بازگرداندن یک معامله

اگر مشکلی پیش آمد و می خواهید تغییرات ایجاد شده در طول تراکنش را برگردانید، می توانید از آن استفاده کنید rollback() روش این همه تغییرات ایجاد شده از زمان شروع تراکنش را لغو می کند.

connection.rollback()

نمونه ای از استفاده از تراکنش ها در پایتون

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

اول، بیایید ایجاد کنیم Customers جدول و درج دو مشتری:

import sqlite3

# Create the Customers table and add two customers
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # Create Customers table
    create_customers_table = '''
    CREATE TABLE IF NOT EXISTS Customers (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL UNIQUE,
        balance REAL NOT NULL
    );
    '''
    cursor.execute(create_customers_table)

    # Insert two customers
    cursor.execute(
        "INSERT INTO Customers (name, balance) VALUES (?, ?);", ('Ashutosh', 100.0))
    cursor.execute(
        "INSERT INTO Customers (name, balance) VALUES (?, ?);", ('Krishna', 50.0))

    connection.commit()

حالا بیایید عملیات انتقال وجه بین آشوتوش و کریشنا را انجام دهیم:

import sqlite3


def transfer_funds(from_customer, to_customer, amount):
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        try:
            # Start a transaction
            cursor.execute("BEGIN;")

            # Deduct amount from the sender
            cursor.execute(
                "UPDATE Customers SET balance = balance - ? WHERE name = ?;", (amount, from_customer))
            # Add amount to the receiver
            cursor.execute(
                "UPDATE Customers SET balance = balance + ? WHERE name = ?;", (amount, to_customer))

            # Commit the changes
            connection.commit()
            print(
                f"Transferred {amount} from {from_customer} to {to_customer}.")

        except Exception as e:
            # If an error occurs, rollback the transaction
            connection.rollback()
            print(f"Transaction failed: {e}")


# Example usage
transfer_funds('Ashutosh', 'Krishna', 80.0)

در این مثال ابتدا a را ایجاد کردیم Customers میز و دو مشتری، آشوتوش با موجودی 100 روپیه و کریشنا با موجودی 50 روپیه وارد شده است. سپس ما یک انتقال 80 روپیه از آشوتوش به کریشنا انجام دادیم. با استفاده از تراکنش‌ها، اطمینان حاصل می‌کنیم که بدهی از حساب آشوتوش و اعتبار حساب کریشنا به صورت یک عملیات اتمی واحد اجرا می‌شود و در صورت بروز هرگونه خطا، یکپارچگی داده‌ها حفظ می‌شود. اگر انتقال ناموفق باشد (مثلاً به دلیل کمبود بودجه)، تراکنش برگشت می‌کند و هر دو حساب بدون تغییر باقی می‌مانند.

روش بهینه سازی عملکرد SQLite Query با نمایه سازی

نمایه سازی یک تکنیک قدرتمند است که در پایگاه داده ها برای بهبود عملکرد پرس و جو استفاده می شود. ایندکس در اصل یک ساختار داده است که مکان سطرها را بر اساس ذخیره می کند روی مقادیر مشخصی از ستون‌ها، دقیقاً مانند نمایه‌ای در پشت کتاب به شما کمک می‌کند تا به سرعت یک موضوع را پیدا کنید.

بدون ایندکس، SQLite باید کل جدول را ردیف به ردیف اسکن کند تا داده های مربوطه را بیابد، که با رشد مجموعه داده ناکارآمد می شود. با استفاده از ایندکس، SQLite می‌تواند مستقیماً به ردیف‌های مورد نیاز شما بپرد و به طور قابل توجهی سرعت اجرای پرس و جو را افزایش دهد.

روش پر کردن پایگاه داده با داده های جعلی

برای آزمایش موثر تاثیر نمایه سازی، به مجموعه داده قابل توجهی نیاز داریم. به جای اضافه کردن دستی رکوردها، می توانیم از آن استفاده کنیم faker کتابخانه برای تولید سریع داده های جعلی. در این بخش، 10000 رکورد جعلی تولید کرده و آنها را در خود قرار می دهیم Students جدول این یک سناریوی دنیای واقعی را شبیه سازی می کند که در آن پایگاه های داده بزرگ می شوند و عملکرد پرس و جو مهم می شود.

ما استفاده خواهیم کرد executemany() روش درج رکوردها به صورت زیر:

import sqlite3
from faker import Faker

# Initialize the Faker library
fake = Faker(['en_IN'])


def insert_fake_students(num_records):
    """Generate and insert fake student data into the Students table."""
    fake_data = [(fake.name(), fake.random_int(min=18, max=25),
                  fake.email()) for _ in range(num_records)]

    # Use 'with' to handle the database connection
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # Insert fake data into the Students table
        cursor.executemany('''
        INSERT INTO Students (name, age, email) 
        VALUES (?, ?, ?);
        ''', fake_data)

        connection.commit()

    print(f"{num_records} fake student records inserted successfully.")


# Insert 10,000 fake records into the Students table
insert_fake_students(10000)

با اجرای این اسکریپت 10000 سوابق تحصیلی جعلی به آن اضافه می شود Students جدول در بخش بعدی، پایگاه داده را پرس و جو می کنیم و عملکرد کوئری ها را با و بدون نمایه سازی مقایسه می کنیم.

چگونه بدون ایندکس پرس و جو کنیم

در این بخش، ما را پرس و جو خواهیم کرد Students جدول بدون هیچ شاخصی برای مشاهده روش عملکرد SQLite در زمانی که هیچ بهینه سازی وجود ندارد. هنگامی که بعداً ایندکس ها را اضافه می کنیم، این به عنوان پایه ای برای مقایسه عملکرد عمل می کند.

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

اول، ما پرس و جو می کنیم Students جدول با جستجوی دانش آموزی با نام خاص. ما زمان لازم برای اجرای پرس و جو را با استفاده از Python ثبت می کنیم time ماژول برای اندازه گیری عملکرد

import sqlite3
import time


def query_without_index(search_name):
    """Query the Students table by name without an index and measure the time taken."""

    # Connect to the database using 'with'
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # Measure the start time
        start_time = time.perf_counter_ns()

        # Perform a SELECT query to find a student by name
        cursor.execute('''
        SELECT * FROM Students WHERE name = ?;
        ''', (search_name,))

        # Fetch all results (there should be only one or a few in practice)
        results = cursor.fetchall()

        # Measure the end time
        end_time = time.perf_counter_ns()

        # Calculate the total time taken
        elapsed_time = (end_time - start_time) / 1000

        # Display the results and the time taken
        print(f"Query completed in {elapsed_time:.5f} microseconds.")
        print("Results:", results)


# Example: Searching for a student by name
query_without_index('Ojasvi Dhawan')

این خروجی است:

Query completed in 1578.10000 microseconds.
Results: [(104, 'Ojasvi Dhawan', 21, 'lavanya26@example.com')]

با اجرای اسکریپت بالا، خواهید دید که جستجوی آن چقدر طول می کشد Students جدول بدون هیچ شاخص برای مثال، اگر 10000 رکورد در جدول وجود داشته باشد، بسته به پرس و جو ممکن است 1000-2000 میکروثانیه طول بکشد. روی اندازه میز و سخت افزار شما این ممکن است برای یک مجموعه داده کوچک خیلی کند به نظر نرسد، اما با اضافه شدن رکوردهای بیشتر، عملکرد کاهش می یابد.

استفاده می کنیم time.perf_counter_ns() برای اندازه گیری زمان لازم برای اجرای پرس و جو در نانوثانیه. این روش برای محک زدن بازه های زمانی کوچک بسیار دقیق است. ما زمان را به میکروثانیه تبدیل می کنیم (us) برای خوانایی راحت تر.

معرفی طرح پرس و جو

هنگام کار با پایگاه های داده، درک روش اجرای پرس و جوها می تواند به شما در شناسایی تنگناهای عملکرد و بهینه سازی کد کمک کند. SQLite یک ابزار مفید برای این کار فراهم می کند EXPLAIN QUERY PLAN، که به شما امکان می دهد مراحلی را که SQLite برای بازیابی داده ها طی می کند تجزیه و تحلیل کنید.

پیشنهاد می‌کنیم بخوانید:  چگونه با استفاده از هوش مصنوعی نظرات مطبوعات مالی را ایجاد کنیم

در این قسمت روش استفاده را معرفی می کنیم EXPLAIN QUERY PLAN برای تجسم و درک عملکرد درونی یک پرس و جو – به طور خاص، چگونه SQLite یک اسکن کامل جدول را زمانی که هیچ شاخصی وجود ندارد انجام می دهد.

استفاده کنیم EXPLAIN QUERY PLAN برای دیدن اینکه چگونه SQLite داده ها را از Students جدول بدون هیچ شاخص ما یک دانش آموز را با نام جستجو می کنیم و طرح پرس و جو مراحلی را که SQLite برای یافتن ردیف های منطبق انجام می دهد را نشان می دهد.

import sqlite3


def explain_query(search_name):
    """Explain the query execution plan for a SELECT query without an index."""

    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # Use EXPLAIN QUERY PLAN to analyze how the query is executed
        cursor.execute('''
        EXPLAIN QUERY PLAN
        SELECT * FROM Students WHERE name = ?;
        ''', (search_name,))

        # Fetch and display the query plan
        query_plan = cursor.fetchall()

        print("Query Plan:")
        for step in query_plan:
            print(step)


# Example: Analyzing the query plan for searching by name
explain_query('Ojasvi Dhawan')

هنگامی که این کد را اجرا می کنید، SQLite جزئیاتی از روش برنامه ریزی برای اجرای پرس و جو را برمی گرداند. در اینجا مثالی از آنچه خروجی ممکن است شبیه باشد آورده شده است:

Query Plan:
(2, 0, 0, 'SCAN Students')

این نشان می دهد که SQLite در حال اسکن کل است Students جدول (اسکن جدول کامل) برای یافتن ردیف هایی که در آن name ستون با مقدار ارائه شده مطابقت دارد (Ojasvi Dhawan). از آنجایی که شاخصی وجود ندارد روی را name ستون، SQLite باید هر ردیف در جدول را بررسی کند.

چگونه یک شاخص ایجاد کنیم

ایجاد نمایه روی یک ستون به SQLite اجازه می دهد تا ردیف ها را سریعتر در طول عملیات پرس و جو پیدا کند. به جای اسکن کل جدول، SQLite می تواند از ایندکس برای پرش مستقیم به ردیف های مربوطه استفاده کند و به طور قابل توجهی سرعت پرس و جوها را افزایش دهد – به خصوص آنهایی که شامل مجموعه داده های بزرگ هستند.

برای ایجاد ایندکس از دستور SQL زیر استفاده کنید:

CREATE INDEX IF NOT EXISTS index-name روی table (column(s));

در این مثال، یک شاخص ایجاد می کنیم روی را name ستون از Students جدول در اینجا روش انجام این کار با پایتون آمده است:

import sqlite3
import time


def create_index():
    """Create an index روی the name column of the Students table."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # SQL command to create an index روی the name column
        create_index_query = '''
        CREATE INDEX IF NOT EXISTS idx_name روی Students (name);
        '''

        # Measure the start time
        start_time = time.perf_counter_ns()

        # Execute the SQL command to create the index
        cursor.execute(create_index_query)

        # Measure the start time
        end_time = time.perf_counter_ns()

        # Commit the changes
        connection.commit()

        print("Index روی 'name' column created successfully!")

        # Calculate the total time taken
        elapsed_time = (end_time - start_time) / 1000

        # Display the results and the time taken
        print(f"Query completed in {elapsed_time:.5f} microseconds.")


# Call the function to create the index
create_index()

خروجی:

Index روی 'name' column created successfully!
Query completed in 102768.60000 microseconds.

اگرچه ایجاد این شاخص به این مدت زمان نیاز دارد (102768.6 میکروثانیه)، این یک عملیات یکبار مصرف است. هنگام اجرای چندین پرس و جو همچنان سرعت قابل توجهی خواهید داشت. در بخش‌های بعدی، مجدداً پایگاه داده را پرس و جو می‌کنیم تا بهبودهای عملکردی که توسط این شاخص ممکن شده است را مشاهده کنیم.

روش پرس و جو با ایندکس ها

در این قسمت نیز همین کار را انجام خواهیم داد SELECT کوئری که قبلا اجرا کردیم، اما این بار از ایندکسی که ایجاد کردیم استفاده خواهیم کرد روی را name ستون از Students جدول ما زمان اجرا را اندازه گیری و ثبت می کنیم تا بهبود عملکرد ارائه شده توسط این شاخص را مشاهده کنیم.

import sqlite3
import time


def query_with_index(student_name):
    """Query the Students table using an index روی the name column."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # SQL command to select a student by name
        select_query = 'SELECT * FROM Students WHERE name = ?;'

        # Measure the execution time
        start_time = time.perf_counter_ns()  # Start the timer

        # Execute the query with the provided student name
        cursor.execute(select_query, (student_name,))
        result = cursor.fetchall()  # Fetch all results

        end_time = time.perf_counter_ns()  # End the timer

        # Calculate the elapsed time in microseconds
        execution_time = (end_time - start_time) / 1000

        # Display results and execution time
        print(f"Query result: {result}")
        print(f"Execution time with index: {execution_time:.5f} microseconds")


# Example: Searching for a student by name
query_with_index('Ojasvi Dhawan')

در اینجا چیزی است که ما در خروجی دریافت می کنیم:

Query result: [(104, 'Ojasvi Dhawan', 21, 'lavanya26@example.com')]
Execution time with index: 390.70000 microseconds

ما می توانیم کاهش قابل توجهی در زمان اجرا در مقایسه با زمانی که پرس و جو بدون شاخص انجام شده است مشاهده کنیم.

بیایید طرح اجرای پرس و جو را برای پرس و جو با شاخص تجزیه و تحلیل کنیم روی را name ستون از Students جدول اگر دوباره همان اسکریپت را برای توضیح کوئری اجرا کنید، خروجی زیر را دریافت خواهید کرد:

Query Plan:
(3, 0, 0, 'SEARCH Students USING INDEX idx_name (name=?)')

اکنون طرح نشان می دهد که پرس و جو از ایندکس استفاده می کند idx_name، تعداد ردیف هایی را که باید اسکن شوند به میزان قابل توجهی کاهش می دهد که منجر به اجرای سریعتر پرس و جو می شود.

مقایسه نتایج عملکرد

حال، بیایید نتایج عملکردی را که هنگام پرس و جو با و بدون شاخص به دست آوردیم، خلاصه کنیم.

مقایسه زمان اجرا

نوع پرس و جو زمان اجرا (میکروثانیه)
بدون شاخص 1578.1
با شاخص 390.7

خلاصه بهبود عملکرد

  • پرس و جو با ایندکس تقریبا 4.04 برابر سریعتر از پرس و جو بدون ایندکس است.

  • زمان اجرا پس از افزودن شاخص حدود 75.24 درصد بهبود یافت.

بهترین روش ها برای استفاده از شاخص ها

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

زمان و چرایی استفاده از شاخص ها

  1. ستون های پرس و جوی مکرر: از شاخص ها استفاده کنید روی ستون هایی که اغلب در آنها استفاده می شود SELECT پرس و جوها، به ویژه آنهایی که در WHERE، JOIN، و ORDER BY بندها این به این دلیل است که نمایه سازی این ستون ها می تواند زمان اجرای پرس و جو را به شدت کاهش دهد.

  2. محدودیت های منحصر به فرد: وقتی ستون هایی دارید که باید مقادیر منحصر به فردی داشته باشند (مانند نام کاربری یا آدرس ایمیل)، ایجاد یک فهرست می تواند این محدودیت را به طور موثر اعمال کند.

  3. مجموعه داده های بزرگ: برای جداول با تعداد رکوردهای زیاد، نمایه ها به طور فزاینده ای سودمند می شوند. آنها جستجوهای سریع را فعال می کنند، که برای حفظ عملکرد با رشد داده های شما ضروری است.

  4. شاخص های ترکیبی: ایجاد نمایه های ترکیبی برای پرس و جوهایی که بر اساس چندین ستون فیلتر یا مرتب می شوند را در نظر بگیرید. به عنوان مثال، اگر اغلب دانش آموزان را با هر دو جستجو می کنید name و age، یک شاخص روی هر دو ستون می توانند چنین پرس و جوهایی را بهینه کنند.

معایب بالقوه شاخص ها

در حالی که شاخص ها مزایای قابل توجهی دارند، برخی از جنبه های منفی بالقوه وجود دارد:

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

  2. افزایش نیازهای ذخیره سازی: ایندکس ها فضای دیسک اضافی را مصرف می کنند. برای میزهای بزرگ، هزینه ذخیره سازی می تواند قابل توجه باشد. این را هنگام طراحی طرح پایگاه داده خود، به ویژه برای سیستم هایی با منابع ذخیره سازی محدود در نظر بگیرید.

  3. مدیریت شاخص مجتمع: داشتن فهرست های زیاد می تواند مدیریت پایگاه داده را پیچیده کند. ممکن است منجر به موقعیت‌هایی شود که در آن شاخص‌های اضافی دارید، که می‌تواند عملکرد را به جای افزایش آن کاهش دهد. بررسی منظم و بهینه سازی شاخص های خود یک تمرین خوب است.

ایندکس ها ابزار قدرتمندی برای بهینه سازی پرس و جوهای پایگاه داده هستند، اما نیاز به بررسی دقیق دارند. ایجاد تعادل بین بهبود عملکرد خواندن و سربار بالقوه روی عملیات نوشتن کلید است. در اینجا چند استراتژی برای دستیابی به این تعادل وجود دارد:

  • نظارت بر عملکرد پرس و جو: از SQLite استفاده کنید EXPLAIN QUERY PLAN برای تجزیه و تحلیل عملکرد جستجوهای شما با و بدون ایندکس. این می تواند به شناسایی شاخص های مفید و غیر ضروری کمک کند.

  • تعمیر و نگهداری منظم: به صورت دوره‌ای فهرست‌های خود را مرور کنید و ارزیابی کنید که آیا هنوز به آن‌ها نیاز دارید یا خیر. فهرست های اضافی یا به ندرت استفاده شده را برای ساده کردن عملیات پایگاه داده خود حذف کنید.

  • تست و ارزیابی کنید: قبل از پیاده‌سازی شاخص‌ها در محیط تولید، آزمایش‌های کاملی برای درک تأثیر آن‌ها انجام دهید روی هر دو عملیات خواندن و نوشتن.

با پیروی از این بهترین شیوه‌ها، می‌توانید از مزایای نمایه‌سازی استفاده کنید و در عین حال معایب احتمالی را به حداقل برسانید و در نهایت عملکرد و کارایی پایگاه داده SQLite خود را افزایش دهید.

روش رسیدگی به خطاها و استثناها

در این بخش، روش رسیدگی به خطاها و استثناها هنگام کار با SQLite در پایتون را مورد بحث قرار خواهیم داد. مدیریت صحیح خطا برای حفظ یکپارچگی پایگاه داده شما و اطمینان از اینکه برنامه شما به طور قابل پیش بینی رفتار می کند بسیار مهم است.

خطاهای رایج در عملیات SQLite

هنگام تعامل با پایگاه داده SQLite، ممکن است چندین خطای رایج ایجاد شود:

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

  2. عدم تطابق نوع داده: تلاش برای درج داده هایی از نوع اشتباه (مثلاً درج رشته ای که در آن عدد مورد انتظار است) می تواند منجر به خطا شود.

  3. خطاهای قفل شدن پایگاه داده: اگر پایگاه داده ای توسط دیگری نوشته شود process یا اتصال، تلاش برای دسترسی به آن می تواند منجر به خطای “پایگاه داده قفل است” شود.

  4. خطاهای نحوی: اشتباهات در نحو SQL شما منجر به خطا در هنگام اجرای دستورات می شود.

روش استفاده از Exception Handling پایتون

مکانیزم های داخلی مدیریت استثناء پایتون (try و except) برای مدیریت خطاها در عملیات SQLite ضروری هستند. با استفاده از این ساختارها، می‌توانید استثناها را بگیرید و بدون اینکه برنامه‌تان از کار بیفتد، پاسخ مناسب بدهید.

در اینجا یک مثال اساسی از روش رسیدگی به خطاها هنگام درج داده در پایگاه داده آورده شده است:

import sqlite3


def add_customer_with_error_handling(name, balance):
    """Add a new customer with error handling."""
    try:
        with sqlite3.connect('my_database.db') as connection:
            cursor = connection.cursor()
            cursor.execute(
                "INSERT INTO Customers (name, balance) VALUES (?, ?);", (name, balance))
            connection.commit()
            print(f"Added customer: {name} with balance: {balance}")

    except sqlite3.IntegrityError as e:
        print(f"Error: Integrity constraint violated - {e}")

    except sqlite3.OperationalError as e:
        print(f"Error: Operational issue - {e}")

    except Exception as e:
        print(f"An unexpected error occurred: {e}")


# Example usage
add_customer_with_error_handling('Vishakha', 100.0)  # Valid
add_customer_with_error_handling('Vishakha', 150.0)  # Duplicate entry

در این مثال:

  • می گیریم IntegrityError، که برای نقض هایی مانند محدودیت های منحصر به فرد مطرح شده است.

  • می گیریم OperationalError برای مسائل کلی مرتبط با پایگاه داده (مانند خطاهای قفل شدن پایگاه داده).

  • ژنریک هم داریم except مسدود کردن برای رسیدگی به هر گونه استثنای غیرمنتظره.

خروجی:

Added customer: Vishakha with balance: 100.0
Error: Integrity constraint violated - UNIQUE constraint failed: Customers.name

بهترین روش ها برای اطمینان از یکپارچگی پایگاه داده

  1. از تراکنش ها استفاده کنید: همیشه هنگام انجام چندین عملیات مرتبط از تراکنش ها (همانطور که در قسمت قبل بحث شد) استفاده کنید. این کمک می کند تا اطمینان حاصل شود که یا همه عملیات ها موفق می شوند یا هیچ یک، حفظ ثبات.

  2. اعتبارسنجی داده های ورودی: قبل از اجرای دستورات SQL، داده های ورودی را برای اطمینان از مطابقت با معیارهای مورد انتظار (به عنوان مثال، انواع صحیح، در محدوده مجاز) اعتبارسنجی کنید.

  3. گرفتن استثناهای خاص: همیشه استثناهای خاص را برای رسیدگی به انواع مختلف خطاها به درستی دریافت کنید. این امکان مدیریت و اشکال زدایی واضح تر خطا را فراهم می کند.

  4. خطاهای ثبت نام: به جای اینکه فقط خطاها را چاپ کنید console، آنها را در یک فایل یا سیستم نظارت ثبت کنید. این به شما کمک می کند تا مشکلات تولید را پیگیری کنید.

  5. انحطاط برازنده: برنامه خود را طوری طراحی کنید که خطاها را به خوبی مدیریت کند. اگر عملیاتی با شکست مواجه شد، به جای خراب کردن برنامه، بازخورد معناداری را به کاربر ارائه دهید.

  6. به طور منظم از داده ها پشتیبان تهیه کنید: به طور منظم از پایگاه داده خود نسخه پشتیبان تهیه کنید تا در صورت خرابی یا خرابی مهم از از دست رفتن داده ها جلوگیری کنید.

  7. از بیانیه های آماده استفاده کنید: عبارات آماده شده به جلوگیری از حملات تزریق SQL کمک می کند و همچنین می تواند عملکرد بهتری را برای پرس و جوهای مکرر ارائه دهد.

روش صادرات و واردات داده ها [Bonus Section]

در این بخش یاد می گیریم که چگونه export داده ها از پایگاه داده SQLite به فرمت های رایج مانند CSV و JSON و همچنین روش انجام آن import داده ها را از این فرمت ها با استفاده از پایتون به SQLite وارد کنید. این برای به اشتراک گذاری داده مفید است، backupو ادغام با سایر برنامه ها.

صادرات داده از SQLite به CSV

صادرات داده به فایل CSV (مقادیر جدا شده با کاما) با کتابخانه های داخلی پایتون ساده است. فایل‌های CSV به‌طور گسترده برای ذخیره‌سازی و تبادل داده‌ها استفاده می‌شوند و آنها را به فرمتی مناسب برای صادرات داده تبدیل می‌کند.

در اینجا روش انجام این کار آمده است export داده ها از یک جدول SQLite به یک فایل CSV:

import sqlite3
import csv

def export_to_csv(file_name):
    """Export data from the Customers table to a CSV file."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # Execute a query to fetch all customer data
        cursor.execute("SELECT * FROM Customers;")
        customers = cursor.fetchall()

        # Write data to CSV
        with open(file_name, 'w', newline='') as csv_file:
            csv_writer = csv.writer(csv_file)
            csv_writer.writerow(['ID', 'Name', 'Balance'])  # Writing header
            csv_writer.writerows(customers)  # Writing data rows

        print(f"Data exported successfully to {file_name}.")

# Example usage
export_to_csv('customers.csv')

چگونه داده ها را به JSON صادر کنیم

به طور مشابه، شما می توانید export داده ها به یک فایل JSON (جاوا اسکریپت Object Notation) که یک فرمت محبوب برای تبادل داده ها، به ویژه در برنامه های کاربردی وب است.

در اینجا مثالی از روش انجام این کار آورده شده است export داده ها به JSON:

import json
import sqlite3


def export_to_json(file_name):
    """Export data from the Customers table to a JSON file."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # Execute a query to fetch all customer data
        cursor.execute("SELECT * FROM Customers;")
        customers = cursor.fetchall()

        # Convert data to a list of dictionaries
        customers_list = [{'ID': customer[0], 'Name': customer[1],
                           'Balance': customer[2]} for customer in customers]

        # Write data to JSON
        with open(file_name, 'w') as json_file:
            json.dump(customers_list, json_file, indent=4)

        print(f"Data exported successfully to {file_name}.")


# Example usage
export_to_json('customers.json')

روش وارد کردن داده ها به SQLite از CSV

شما همچنین می توانید import داده ها از یک فایل CSV به یک پایگاه داده SQLite. این برای پر کردن پایگاه داده شما با مجموعه داده های موجود مفید است.

در اینجا روش انجام این کار آمده است import داده های یک فایل CSV:

import csv
import sqlite3


def import_from_csv(file_name):
    """Import data from a CSV file into the Customers table."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # Open the CSV file for reading
        with open(file_name, 'r') as csv_file:
            csv_reader = csv.reader(csv_file)
            next(csv_reader)  # Skip the header row

            # Insert each row into the Customers table
            for row in csv_reader:
                cursor.execute(
                    "INSERT INTO Customers (name, balance) VALUES (?, ?);", (row[1], row[2]))

        connection.commit()
        print(f"Data imported successfully from {file_name}.")


# Example usage
import_from_csv('customer_data.csv')

روش وارد کردن داده به SQLite از JSON

به طور مشابه، وارد کردن داده از یک فایل JSON ساده است. می توانید فایل JSON را بخوانید و داده ها را در جدول SQLite خود وارد کنید.

در اینجا روش انجام آن آمده است:

import json
import sqlite3


def import_from_json(file_name):
    """Import data from a JSON file into the Customers table."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # Open the JSON file for reading
        with open(file_name, 'r') as json_file:
            customers_list = json.load(json_file)

            # Insert each customer into the Customers table
            for customer in customers_list:
                cursor.execute("INSERT INTO Customers (name, balance) VALUES (?, ?);", (customer['Name'], customer['Balance']))

        connection.commit()
        print(f"Data imported successfully from {file_name}.")


# Example usage
import_from_json('customer_data.json')

بسته بندی

و این یک بسته بندی است! این راهنما شما را با اصول کار با SQLite در پایتون آشنا کرده است که شامل همه چیز از تنظیم محیط شما گرفته تا پرس و جو و دستکاری داده ها و همچنین صادرات و وارد کردن اطلاعات می شود. امیدوارم برای شما مفید بوده باشد و علاقه شما را به استفاده از SQLite برای پروژه های خود برانگیخته باشد.

اکنون زمان آن رسیده است که دانش جدید خود را عملی کنید! من شما را تشویق می کنم که پروژه خود را با استفاده از SQLite و Python ایجاد کنید. خواه این یک برنامه کاربردی ساده برای مدیریت کتابخانه شما باشد، یک ابزار بودجه بندی، یا چیزی منحصر به فرد، امکانات بی پایان است.

پس از تکمیل پروژه خود، آن را به اشتراک بگذارید روی توییتر و من را تگ کنید! من دوست دارم ببینم چه چیزی خلق کرده اید و موفقیت های شما را جشن بگیرم.

شما می توانید تمام کدهای این آموزش را پیدا کنید روی GitHub. از اینکه دنبال می کنید و کد نویسی خوشحال هستید متشکرم!

با استفاده از ابزار TOC Generator فهرست مطالب را برای مقالات freeCodeCamp خود به صورت رایگان ایجاد کنید.