Python Coding Academy
🐍 آموزش جامع Python — پست ۲۳۷
پیادهسازی CRUD با Repository Pattern در SQLite
در پست قبل با Repository Pattern آشنا شدیم و عملیات دریافت و ذخیره کاربران را داخل یک کلاس قرار دادیم.
حالا میخواهیم چهار عملیات اصلی مدیریت داده را کامل کنیم که به آنها CRUD میگویند.
Create: ایجاد رکورد
Read: خواندن رکورد
Update: ویرایش رکورد
Delete: حذف رکورد
🔹 تکمیل کلاس UserRepository
در فایل user_repository.py:
class UserRepository:
def __init__(self, connection):
self.connection = connection
def create_table(self):
self.connection.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
""")
# Create
def add_user(self, name):
cursor = self.connection.execute(
"INSERT INTO users (name) VALUES (?)",
(name,)
)
return cursor.lastrowid
# Read
def get_by_id(self, user_id):
return self.connection.execute(
"SELECT id, name FROM users WHERE id = ?",
(user_id,)
).fetchone()
def get_all(self):
return self.connection.execute(
"SELECT id, name FROM users ORDER BY id"
).fetchall()
# Update
def update_user(self, user_id, new_name):
cursor = self.connection.execute(
"UPDATE users SET name = ? WHERE id = ?",
(new_name, user_id)
)
return cursor.rowcount > 0
# Delete
def delete_user(self, user_id):
cursor = self.connection.execute(
"DELETE FROM users WHERE id = ?",
(user_id,)
)
return cursor.rowcount > 0
🔹 استفاده از عملیات CRUD
در فایل main.py:
from contextlib import closing
from database import get_connection
from user_repository import UserRepository
with closing(get_connection()) as connection:
with connection:
users = UserRepository(connection)
users.create_table()
user_id = users.add_user("Ali")
print("Created:", user_id)
user = users.get_by_id(user_id)
print("Read:", dict(user) if user else None)
updated = users.update_user(user_id, "Reza")
print("Updated:", updated)
deleted = users.delete_user(user_id)
print("Deleted:", deleted)
خروجی نمونه:
Created: 1
Read: {'id': 1, 'name': 'Ali'}
Updated: True
Deleted: True
شناسه ممکن است در دیتابیس موجود شما متفاوت باشد.
🔹 چرا متدهای Update و Delete مقدار bool برمیگردانند؟
در این دو متد:
return cursor.rowcount > 0
اگر حداقل یک ردیف تغییر کرده یا حذف شده باشد، نتیجه True است؛ در غیر این صورت False خواهد بود.
به این ترتیب، برنامه میتواند تشخیص دهد آیا رکورد موردنظر پیدا شده و عملیات روی آن انجام شده است یا خیر.
⚠️ نکته مهم
تمام Queryها از Placeholder یعنی ? استفاده میکنند. این کار از ترکیب مستقیم ورودی کاربر با رشته SQL جلوگیری میکند.
همچنین with connection: تراکنش را مدیریت میکند و closing() اتصال را پس از خروج از بلوک میبندد.
🧠 خلاصه
Create → add_user()
Read → get_by_id(), get_all()
Update → update_user()
Delete → delete_user()
این چهار عملیات پایه بسیاری از برنامههای واقعی مانند مدیریت کاربران، محصولات و سفارشها هستند.
🎯 تمرین
متدی به نام rename_user(user_id, new_name) طراحی کن که:
کاربر را بر اساس شناسه پیدا کند.
نام او را تغییر دهد.
مشخص کند آیا رکوردی تغییر کرده است یا خیر.
میتوانی از متد update_user() استفاده مجدد کنی، بدون اینکه Query تکراری بنویسی.
پست ۲۳۷ از دوره جامع Python 🐍
3 ·