اسکیوال الکمی
اسکیوال الکمی (انگلیسی: SQLAlchemy) یک مجموعه ابزار منبع باز اسکیوال و یک نگاشت دهنده شی-رابطه ای (انگلیسی: object-relational mapper) یا ORM برای زبان برنامهنویسی پایتون با پروانه ام ای تی (انگلیسی: MIT Licence) است.
نویسنده(های) اصلی | Michael Bayer[1] |
---|---|
انتشار ابتدایی | ۱۴ فوریه ۲۰۰۶[2] |
انتشار پایدار | 1.2.7
۲۰ آوریل ۲۰۱۸ |
انتشار آزمایشی | 1.3
|
مخزن | |
نوشتهشده با | پایتون (زبان برنامهنویسی) |
سیستمعامل | چندسکویی |
گونه | نگاشت دهنده شی-رابطه ای |
پروانه | پروانه ام آی تی[3] |
وبگاه |
SQLAlchemy "یک مجموعه کامل از الگوهای مانایی (انگلیسی: persistence patterns) که برای دسترسی بهینه و با عملکرد عالی به پایگاه داده طراحی شدهاند را فراهم میکند. این مجموعه الگوها در زبان برنامه نویسی پایتون گنجانده شدهاست. فلسفه SQLAlchemy این است که هنگام دسترسی به پایگاه داده، پایگاه دادههای اس کیو ال، هر چه کمتر شبیه مجموعه ای از اشیا رفتار کنند و هنگام افزایش سطح انتزاع هر چه کمتر شبیه جداول و سطرهای پایگاه داده رابطه ای به نظر برسند. به همین دلیل SQLAlchemy به جای استفاده از "الگوی ثبت کُنِشوَر" (انگلیسی: active record pattern) که پیش از آن بوسیلهٔ تعدادی از نگاشت دهندههای شی-رابطه ای استفاده شده بود، "الگوی نگاشت دهنده داده" (انگلیسی: data mapper pattern) (مثل هایبرنیت در جاوا) را به کار گرفتهاست.[4] گرچه افزونههایی وجود دارد که به کاربر اجازه توسعه با استفاده از نحو اعلانی (انگلیسی: declarative syntax) را میدهد.[5]
SQLAlchemy برای اولین بار در مارس ۲۰۰۶ منتشر شد[6] و به سرعت به همراه 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
منابع
- Mike Bayer is the creator of SQLAlchemy and Mako Templates for Python.
- "Download - SQLAlchemy". SQLAlchemy. Retrieved 21 February 2015.
- "zzzeek / sqlalchemy / source / LICENSE". BitBucket. Retrieved 21 February 2015.
- in The architecture of open source applications
- «declarative». بایگانیشده از اصلی در ۱۲ ژوئن ۲۰۱۱. دریافتشده در ۱۰ مه ۲۰۱۸.
- http://decisionstats.com/2015/12/29/interview-mike-bayer-sqlalchemy-pydata-python/
- Gift, Noah (12 Aug 2008). "Using SQLAlchemy". Developerworks. IBM. Retrieved 8 Feb 2011.
- Rick Copeland, Essential SQLAlchemy, O'Reilly, 2008, ISBN 0-596-51614-2