Python Coding Academy
🐍 آموزش جامع Python — پست ۲۳۸
اعتبارسنجی ورودیها در Repository
در پست قبل عملیات CRUD را پیادهسازی کردیم.
اما یک Repository خوب نباید هر دادهای را بدون بررسی وارد دیتابیس کند. برای مثال، نام کاربر نباید خالی یا فقط شامل فاصله باشد.
در این پست یاد میگیریم چگونه پیش از اجرای Query، ورودیها را اعتبارسنجی کنیم.
🔹 اعتبارسنجی نام کاربر
در فایل user_repository.py، متد add_user() را به این شکل تغییر بده:
def add_user(self, name):
if not isinstance(name, str):
raise TypeError("Name must be a string")
name = name.strip()
if not name:
raise ValueError("Name cannot be empty")
cursor = self.connection.execute(
"INSERT INTO users (name) VALUES (?)",
(name,)
)
return cursor.lastrowid
در این کد:
isinstance() نوع داده را بررسی میکند.
strip() فاصلههای ابتدا و انتهای نام را حذف میکند.
اگر نام خالی باشد، ValueError ایجاد میشود.
فقط پس از اعتبارسنجی، دستور SQL اجرا میشود.
🔹 اعتبارسنجی شناسه
برای متدهای ویرایش و حذف نیز میتوانیم شناسه را بررسی کنیم:
def validate_user_id(self, user_id):
if isinstance(user_id, bool) or not isinstance(user_id, int):
raise TypeError("User ID must be an integer")
if user_id <= 0:
raise ValueError("User ID must be positive")
سپس در متد ویرایش:
def update_user(self, user_id, new_name):
self.validate_user_id(user_id)
if not isinstance(new_name, str):
raise TypeError("Name must be a string")
new_name = new_name.strip()
if not new_name:
raise ValueError("Name cannot be empty")
cursor = self.connection.execute(
"UPDATE users SET name = ? WHERE id = ?",
(new_name, user_id)
)
return cursor.rowcount > 0
نکته: در Python، مقدار bool زیرنوع int است؛ بنابراین برای رد کردن True و False باید آنها را جداگانه بررسی کنیم.
🔹 مدیریت خطا هنگام استفاده
در فایل main.py:
try:
user_id = users.add_user(" ")
except (TypeError, ValueError) as error:
print("Invalid input:", error)
خروجی:
Invalid input: Name cannot be empty
با مدیریت خطا، برنامه میتواند بهجای متوقف شدن ناگهانی، پیام مناسبی نمایش دهد.
⚠️ نکته مهم
اعتبارسنجی در Repository به کیفیت دادهها کمک میکند؛ اما جایگزین محدودیتهای دیتابیس مانند NOT NULL و CHECK نیست.
بهتر است از هر دو استفاده کنیم:
اعتبارسنجی Python برای ارائه خطاهای واضح.
محدودیتهای SQLite برای محافظت از یکپارچگی دادهها.
🧠 خلاصه
ورودی
↓
بررسی نوع
↓
بررسی مقدار
↓
اجرای Query پارامتری
↓
ثبت یا دریافت نتیجه
🎯 تمرین
متد delete_user() را طوری تغییر بده که:
شناسه باید از نوع int باشد.
مقدارهای True و False پذیرفته نشوند.
شناسه باید بزرگتر از صفر باشد.
در صورت معتبر بودن، رکورد حذف شود.
پست ۲۳۸ از دوره جامع Python 🐍
6 ·