کاوش ORM – نگاشت رابطه ای شی
پایگاههای داده ابزاری بسیار قدرتمند برای توسعهدهندگان هستند، زیرا به ما اجازه میدهند اطلاعات را در چندین کاربرد یک برنامه ذخیره کرده و به آن دسترسی داشته باشیم. بدون آنها، بیشتر اطلاعاتی که ایجاد می کنیم پس از اجرا و بسته شدن برنامه غیرقابل دسترسی می شوند. در میان اطلاعاتی که در غیر این صورت از دست میرود، دادههای مربوط به نمونههای کلاس است. فرض کنید یک برنامه کاربردی دارید که اطلاعات یک حساب در بانک را نمایش می دهد. یکی از راه هایی که می توانیم این حساب را نشان دهیم استفاده از کلاسی است که دارای متغیرهایی مانند نام، موجودی، شماره حساب و غیره است.
برای ذخیره این داده ها و در نهایت بازیابی و تخصیص مجدد آن به یک نمونه، باید پیاده سازی کنیم نگاشت رابطه ای شی، یا ORM به طور خلاصه ORM به سادگی به روشی اشاره دارد که با آن کلاس هایی را برای ذخیره و بازیابی اطلاعات در برخی پایگاه داده تنظیم می کنیم. در مورد این پست وبلاگ خاص، نحوه پیاده سازی را بررسی خواهیم کرد ORM استفاده كردن پایتون و SQLite.
برپایی
اول از همه، ما باید کمی تنظیمات را انجام دهیم. ما با نصب شروع می کنیم sqlite3 به فضای کاری ما هنگامی که این کار انجام شد، باید آن را به فایل خود وارد کنیم و اتصال خود را به فایل پایگاه داده خود و یک مکان نما در این اتصال برای اجرای دستوراتی مانند این مقداردهی اولیه کنیم:
import sqlite3
CONN = sqlite3.connect(database.db)
CURSOR = CONN.cursor()
ایجاد جدول
با انجام این تنظیمات، میتوانیم به سمت ایجاد نقشهبردار خود برویم. بیایید با مثال قبلی خود از کلاس مشتری ادامه دهیم. ابتدا باید یک جدول برای ذخیره داده ها ایجاد کنیم.
@classmethod
def create_table(cls):
sql = “””
CREATE IF NOT EXISTS customers (
id INTEGER PRIMARY KEY ,
name TEXT,
account_number INTEGER,
balance REAL
)
”””
CURSOR.execute(sql)
CONN.commit()
اجرای این متد در کلاس Customer جدولی به ما می دهد که در واقع می توانیم داده ها را ذخیره و از آن بازیابی کنیم.
delete_table
اما قبل از شروع این کار، بیایید روشی را برای حذف جدول خود در صورتی که میخواهیم شروع جدیدی داشته باشیم ایجاد کنیم:
@classmethod
def delete_table(cls)
sql = “””
DROP TABLE IF EXISTS customers;
”””
CURSOR.execute(sql)
CONN.commit()
هر دوی این متدهای کلاس بالا دارای سه عنصر اصلی هستند SQLite کدی که می خواهیم اجرا کنیم، ما مکان نما برای اجرای آن کد و خارج کردن CONN برای انجام تغییرات در پایگاه داده ما.
ذخیره و حذف کنید
اکنون که متدهایی برای ایجاد و حذف جدول خود داریم، بیایید متدهای مربوطه را برای ایجاد و حذف ردیف های جدول برای ویژگی کلاس خود ایجاد کنیم. به جای متدهای کلاس، این دو متد فقط برای فراخوانی بر روی یک نمونه از یک کلاس، نه خود شی کلاس:
def save(self):
sql = “””
INSERT INTO customers (
name, account_number, balance
)
VALUES (?, ?, ?)
”””
CURSOR.execute(sql, (
self.name, self.account_number, self.balance
))
CONN.commit()
self.id = CURSOR.lastrowid
type(self).all[self.id] = self
def delete(self):
sql = “””
DELETE FROM customers
WHERE id = ?
“””
CURSOR.execute(sql, (self.id,))
CONN.commit()
del type(self).all[self.id]
self.id = None
در روش ذخیره، چند مرحله جدید را معرفی می کنیم. اول علامت سوال در sql
. اینها وجود دارند تا بهعنوان نگهدارندههای مکانی برای دادههایی که میخواهیم از آنها عبور کنیم، عمل کنند. زمانی که execute را به عنوان پارامتر دوم فراخوانی می کنیم، اطلاعات را ارسال می کنیم. ممکن است متوجه شده باشید که یک کاما اضافی در روش حذف پس از آن وجود دارد self.id
. این به این دلیل است که آرگومان دوم برای اجرا باید a باشد چندتایی، بنابراین باید کاما را وارد کنیم حتی اگر فقط یک متغیر را پاس می کنیم.
پس از اینکه اطلاعات خود را به جدول اضافه کردیم، مقدار را تنظیم می کنیم id
از نمونه ما برابر با متناظر آن است id
در جدول ما از آن استفاده می کنیم id
برای ذخیره نمونه خود در یک شی دیکشنری که یک ویژگی کلاس است. صفت ما نامیده می شود all
، به عنوان یک فرهنگ لغت خالی در بالای کلاس ما تعریف می شود و برای پیگیری تمام نمونه های موجود کلاس ما استفاده می شود. بدون آن، ما میتوانیم با ایجاد تصادفی چندین نمونه یکسان، حافظه زیادی را هدر دهیم.
ما نیز استفاده می کنیم id
برای پیدا کردن ردیفی در جدول خود که می خواهیم حذف کنیم. پس از حذف اطلاعات از جدول، باید شی را از دیکشنری همه حذف کنیم و شناسه نمونه را حذف کنیم.
instance_from_db و find_by_id
اکنون که روش های خود را برای دستکاری اطلاعات در جدول داریم، آخرین روش ضروری ما بازیابی داده ها از جدول و ایجاد یک نمونه جدید است. هر دوی این متدها متدهای کلاسی خواهند بود:
@classmethod
def instance_from_db(cls, row):
customer = cls.all.get(row[0])
if customer:
customer.name = row[1]
customer.account_number = row[2]
customer.balance = row[3]
else:
customer = cls(row[1], row[2], row[3])
customer.id = row[0]
cls.all[customer.id] = customer
return customer
@classmethod
def find_by_id(cls, id):
sql = “””
SELECT * FROM customers
WHERE id = ?
”””
row = CURSOR.execute(sql, (id,)).fetchone()
return cls.instance_from_db(row) if row else None
بیایید این دو روش آخر را بشکنیم. شروع با instance_from_db
، ردیف خود را از آن تهیه می کنیم find_by_id
و سعی کنید نمونه مربوطه را پیدا کنید که از قبل در فرهنگ لغت همه ما وجود دارد. اگر یکی وجود داشته باشد، اطلاعات را از جدول می گیرد و نمونه را به روز می کند تا مطمئن شود مطابقت دارند. اگر وجود نداشته باشد، پیش می رود و یک نمونه جدید می سازد و برمی گرداند.
در نهایت، ما وجود دارد find_by_id
روشی که یک شناسه را به عنوان پارامتر می گیرد و یک نمونه مشتری را برمی گرداند. بیشتر کدهای موجود در آن باید آشنا به نظر برسند، اما یک چیز جدید وجود دارد. را fetchone
متد در انتها کد اجرا شده را می گیرد و لیستی حاوی اطلاعات از سطر اول که مطابق با WHERE
وضعیت.
ما میتوانیم به تعداد روشهایی بنویسیم که روشهای مختلفی برای تعامل با جدول وجود دارد SQLite. با این حال، با این روش ها، شما استخوان های یک پایه را دارید ORM. موفق باشید و کد نویسی شاد!