استفاده از SQLAlchemy برای ORM در پایتون
در دنیای توسعه وب و برنامههای دیتابیس محور، تعامل مستقیم با SQL میتواند زمانبر و مستعد خطا باشد. Object-Relational Mapping (ORM) یا نگاشت شیء-رابطهای، راه حلی برای این مشکل ارائه میدهد. ORM به شما امکان میدهد با اشیاء پایتون کار کنید و به طور خودکار دستورات SQL مربوطه را تولید و اجرا کند. SQLAlchemy یکی از قدرتمندترین و محبوبترین کتابخانههای ORM در پایتون است. این مقاله به بررسی عمیق SQLAlchemy، مفاهیم کلیدی آن و نحوه استفاده از آن برای تعامل با پایگاه داده میپردازد. این آموزش در دسته ‘کتابخانههای خاص و کاربردی’ پایتون قرار میگیرد.
مقدمهای بر SQLAlchemy
SQLAlchemy یک ابزار جامع برای کار با پایگاههای داده رابطهای در پایتون است. این کتابخانه فراتر از یک ORM ساده است و قابلیتهای مختلفی از جمله Core (تعامل مستقیم با SQL)، Expression Language (ساختن کوئریهای SQL به صورت برنامهنویسی) و ORM را ارائه میدهد. ORM در SQLAlchemy به شما اجازه میدهد جداول پایگاه داده را به عنوان کلاسهای پایتون تعریف کنید و ردیفهای جداول را به عنوان نمونههایی از آن کلاسها در نظر بگیرید. این رویکرد باعث میشود کد شما خواناتر، قابل نگهداریتر و کمتر وابسته به جزئیات پیادهسازی پایگاه داده شود.
نصب و راهاندازی
برای شروع کار با SQLAlchemy، ابتدا باید آن را نصب کنید. میتوانید این کار را با استفاده از pip انجام دهید:
pip install sqlalchemy
پس از نصب، باید یک موتور (Engine) برای اتصال به پایگاه داده خود ایجاد کنید. موتور، نقطه ورود به پایگاه داده است و مسئول مدیریت اتصالات و اجرای کوئریها میباشد. فرمت کلی ایجاد موتور به این صورت است:
from sqlalchemy import create_engine
engine = create_engine('dialect+driver://username:password@host:port/database')
به جای placeholderها، باید اطلاعات مربوط به پایگاه داده خود را وارد کنید. به عنوان مثال، برای اتصال به یک پایگاه داده SQLite، میتوانید از این کد استفاده کنید:
engine = create_engine('sqlite:///mydatabase.db')
تعریف مدلها (Models)
در SQLAlchemy، مدلها کلاسهایی هستند که جداول پایگاه داده را نمایش میدهند. برای تعریف یک مدل، باید از کلاس `declarative_base()` استفاده کنید و سپس کلاسهای خود را از آن مشتق کنید. هر کلاس مدل، ویژگیهایی خواهد داشت که ستونهای جدول مربوطه را نشان میدهند.
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
def __repr__(self):
return f""
در این مثال، کلاس `User` یک مدل برای جدول `users` است. ویژگیهای `id`، `name` و `email` ستونهای جدول را نشان میدهند. `primary_key=True` مشخص میکند که ستون `id` کلید اصلی جدول است. متد `__repr__` برای نمایش بهتر اشیاء `User` در خروجی کنسول تعریف شده است.
ایجاد جداول در پایگاه داده
پس از تعریف مدلها، باید جداول مربوطه را در پایگاه داده ایجاد کنید. این کار را میتوان با استفاده از متد `create_all()` موتور انجام داد:
Base.metadata.create_all(engine)
این کد تمام جداول تعریف شده در مدلها را در پایگاه داده ایجاد میکند.
تعامل با پایگاه داده (CRUD Operations)
اکنون که جداول را ایجاد کردهایم، میتوانیم با پایگاه داده تعامل داشته باشیم. SQLAlchemy امکان انجام عملیات CRUD (Create, Read, Update, Delete) را به راحتی فراهم میکند.
ایجاد (Create)
برای ایجاد یک ردیف جدید در جدول، ابتدا یک نمونه از کلاس مدل ایجاد میکنیم و سپس آن را به پایگاه داده اضافه میکنیم:
from sqlalchemy.session import sessionmaker Session = sessionmaker(bind=engine) session = Session() new_user = User(name='John Doe', email='john.doe@example.com') session.add(new_user) session.commit()
در این مثال، یک نمونه جدید از کلاس `User` ایجاد شده و با استفاده از متدهای `add()` و `commit()` به پایگاه داده اضافه شده است.
خواندن (Read)
برای خواندن دادهها از پایگاه داده، میتوان از متد `query()` استفاده کرد. این متد یک شیء Query را برمیگرداند که میتوان از آن برای فیلتر کردن، مرتبسازی و انتخاب دادهها استفاده کرد:
users = session.query(User).all()
for user in users:
print(user)
# خواندن یک کاربر خاص بر اساس ID
user = session.query(User).filter_by(id=1).first()
print(user)
در این مثال، تمام کاربران از جدول `users` خوانده شده و چاپ شدهاند. همچنین، یک کاربر خاص بر اساس ID خوانده شده و چاپ شده است.
بهروزرسانی (Update)
برای بهروزرسانی یک ردیف در جدول، ابتدا ردیف مورد نظر را از پایگاه داده خوانده، ویژگیهای آن را تغییر داده و سپس تغییرات را به پایگاه داده اعمال میکنیم:
user = session.query(User).filter_by(id=1).first() user.email = 'john.newemail@example.com' session.commit()
در این مثال، ایمیل کاربر با ID برابر 1 بهروزرسانی شده است.
حذف (Delete)
برای حذف یک ردیف از جدول، ابتدا ردیف مورد نظر را از پایگاه داده خوانده و سپس آن را با استفاده از متد `delete()` حذف میکنیم:
user = session.query(User).filter_by(id=1).first() session.delete(user) session.commit()
در این مثال، کاربر با ID برابر 1 از جدول `users` حذف شده است.
روابط بین جداول (Relationships)
SQLAlchemy از روابط بین جداول پشتیبانی میکند. این روابط میتوانند از نوع یک به یک، یک به چند یا چند به چند باشند. برای تعریف روابط، میتوان از ویژگیهای `relationship()` استفاده کرد.
به عنوان مثال، فرض کنید یک جدول `Posts` داریم که با جدول `Users` رابطه یک به چند دارد (یک کاربر میتواند چندین پست داشته باشد). میتوان این رابطه را به صورت زیر تعریف کرد:
from sqlalchemy import ForeignKey
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(String)
content = Column(String)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User")
def __repr__(self):
return f""
در این مثال، ویژگی `user_id` یک کلید خارجی به جدول `users` است. ویژگی `user` یک رابطه با کلاس `User` تعریف میکند. با استفاده از این رابطه، میتوان به راحتی به اطلاعات کاربر مربوط به هر پست دسترسی پیدا کرد.
نتیجهگیری
SQLAlchemy یک کتابخانه قدرتمند و انعطافپذیر برای کار با پایگاههای داده رابطهای در پایتون است. با استفاده از ORM SQLAlchemy، میتوانید کد خود را خواناتر، قابل نگهداریتر و کمتر وابسته به جزئیات پیادهسازی پایگاه داده کنید. این مقاله به بررسی مفاهیم کلیدی SQLAlchemy و نحوه استفاده از آن برای انجام عملیات CRUD و تعریف روابط بین جداول پرداخت. با تمرین و استفاده مداوم، میتوانید از تمام قابلیتهای SQLAlchemy برای توسعه برنامههای دیتابیس محور خود بهرهمند شوید.

بدون دیدگاه