اس‌کیوال الکمی

اس‌کیوال الکمی (انگلیسی: SQLAlchemy) یک مجموعه ابزار منبع باز اس‌کیوال و یک نگاشت دهنده شی-رابطه ای (انگلیسی: object-relational mapper) یا ORM برای زبان برنامه‌نویسی پایتون با پروانه ام ای تی (انگلیسی: MIT Licence) است.

اس‌کیوال اَلکِمی
نویسنده(های)
اصلی
Michael Bayer[۱]
انتشار ابتدایی۱۴ فوریه ۲۰۰۶؛ ۱۸ سال پیش (۲۰۰۶-14}})[۲]
انتشار پایدار
1.2.7
۲۰ آوریل ۲۰۱۸؛ ۶ سال پیش (۲۰۱۸-20}})
انتشار آزمایشی
1.3
مخزن
نوشته‌شده باپایتون (زبان برنامه‌نویسی)
سیستم‌عاملچندسکویی
گونهنگاشت دهنده شی-رابطه ای
پروانهپروانه ام آی تی[۳]
وبگاه
مایک بایر هنگام سخنرانی در مورد SQLAlchemy در PyCon 2012

SQLAlchemy "یک مجموعه کامل از الگوهای مانایی (انگلیسی: persistence patterns) که برای دسترسی بهینه و با عملکرد عالی به پایگاه داده طراحی شده‌اند را فراهم می‌کند. این مجموعه الگوها در زبان برنامه نویسی پایتون گنجانده شده‌است. فلسفه SQLAlchemy این است که هنگام دسترسی به پایگاه داده، پایگاه داده‌های اس کیو ال، هر چه کمتر شبیه مجموعه ای از اشیا رفتار کنند و هنگام افزایش سطح انتزاع هر چه کمتر شبیه جداول و سطر‌های پایگاه داده رابطه ای به نظر برسند. به همین دلیل SQLAlchemy به جای استفاده از "الگوی ثبت کُنِش‌وَر" (انگلیسی: active record pattern) که پیش از آن بوسیلهٔ تعدادی از نگاشت دهنده‌های شی-رابطه ای استفاده شده بود، "الگوی نگاشت دهنده داده" (انگلیسی: data mapper pattern) (مثل هایبرنیت در جاوا) را به کار گرفته‌است.[۴] گرچه افزونه‌هایی وجود دارد که به کاربر اجازه توسعه با استفاده از نحو اعلانی (انگلیسی: declarative syntax) را می‌دهد.[۵]

SQLAlchemy برای اولین بار در مارس ۲۰۰۶ منتشر شد[۶] و به سرعت به همراه ORM جنگو، به یکی از ابزارهای نگاشت دهنده شی-رابطه ای پراستفاده در میان برنامه نویسان پایتون تبدیل شد.

مثال ویرایش

مثال زیر نشان دهنده یک رابطه n-به-۱ بین فیلم‌ها و کارگرداناننشان است. در این مثال نشان داده خواهد شد که

  • چگونه از کلاس‌های تعریف شده توسط کاربران، جداول پایگاه داده ایجاد می‌شوند
  • چگونه نمونه‌های دارای رابطه توسط دو سوی رابطه ساخته می‌شوند
  • چگونه قادر هستیم به داده‌ها دسترسی پیدا کنیم (که نشان دهنده قابلیت کوئری‌های SQLی که به صورت خودکار تولید شده‌اند برای بارگذاری زرنگ (انگلیسی: eager loading) و تنبل (انگلیسی: lazy loading) است.

تعریف شِما ویرایش

ایجاد دو کلاس پایتون و جداول پایگاه داده متناظر در DBMS:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, sessionmaker

Base = declarative_base()

class Movie(Base):
    __tablename__ = 'movies'

    id = Column(Integer, primary_key=True)
    title = Column(String(255), nullable=False)
    year = Column(Integer)
    directed_by = Column(Integer, ForeignKey('directors.id'))

    director = relation("Director", backref='movies', lazy=False)

    def __init__(self, title=None, year=None):
        self.title = title
        self.year = year

    def __repr__(self):
        return "Movie(%r, %r, %r)" % (self.title, self.year, self.director)

class Director(Base):
    __tablename__ = 'directors'

    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False, unique=True)

    def __init__(self, name=None):
        self.name = name

    def __repr__(self):
        return "Director(%r)" % (self.name)

engine = create_engine('dbms://user:pwd@host/dbname')
Base.metadata.create_all(engine)

عمل Insertion ویرایش

امکان insert کردن رابطه کارگردان-فیلم به وسیلهٔ هر یک از موجودیت‌ها:

Session = sessionmaker(bind=engine)
session = Session()

m1 = Movie("Robocop", 1987)
m1.director = Director("Paul Verhoeven")

d2 = Director("George Lucas")
d2.movies = [Movie("Star Wars", 1977), Movie("THX 1138", 1971)]

try:
    session.add(m1)
    session.add(d2)
    session.commit()
except:
    session.rollback()

کوئری زدن ویرایش

alldata = session.query(Movie).all()
for somedata in alldata:
    print somedata

SQLAlchemy کوئری زیر را به DBMS ارسال می‌کند (با حذف نام مستعار):

SELECT movies.id, movies.title, movies.year, movies.directed_by, directors.id, directors.name
FROM movies LEFT OUTER JOIN directors ON directors.id = movies.directed_by

خروجی:

Movie('Robocop', 1987L, Director('Paul Verhoeven'))
Movie('Star Wars', 1977L, Director('George Lucas'))
Movie('THX 1138', 1971L, Director('George Lucas'))

با تنظیم lazy=True (پیش فرض)، SQLAlchemy ابتدا یک کوئری برای دریافت لیست فیلم‌ها ارسال کرده و تنها زمانی که به هر کارگردان نیاز باشد (به دلیل تنبل بودن عملیات بارگذاری)، یک کوئری برای دریافت نام کارگردان ارسال خواهد کرد:

SELECT movies.id, movies.title, movies.year, movies.directed_by
FROM movies

SELECT directors.id, directors.name
FROM directors
WHERE directors.id = %s

منابع ویرایش

  1. Mike Bayer is the creator of SQLAlchemy and Mako Templates for Python.
  2. "Download - SQLAlchemy". SQLAlchemy. Retrieved 21 February 2015.
  3. "zzzeek / sqlalchemy / source / LICENSE". BitBucket. Retrieved 21 February 2015.
  4. in The architecture of open source applications
  5. «declarative». بایگانی‌شده از اصلی در ۱۲ ژوئن ۲۰۱۱. دریافت‌شده در ۱۰ مه ۲۰۱۸.
  6. http://decisionstats.com/2015/12/29/interview-mike-bayer-sqlalchemy-pydata-python/

پیوند به بیرون ویرایش