آموزش اس کیو ال الکمی

آنچه در این صفحه می خوانید:

اس کیو ال الکمی (SQLAlchemy)

پایگاه های داده همه جا هستند و به عنوان یک دانشمند داده، شما باید همیشه با آنها ارتباط برقرار کنید. SQLAlchemy ابزار Python SQL یک راه قابل دسترس و بصری برای ساختن پرس وجو و ارسال در پایگاه داده های اس کیوال لایت ،مای اس کیوال و پستگرس کیوال (و بسیاری دیگر) فراهم می کند که دانشمند داده با همه آنها در زندگی روزمره مواجه خواهد شد. SQLAlchemy یک ابزار ابزار اوپن سورس SQL و نقشه بردار شی-رابطه ای (ORM) برای زبان برنامه نویسی پایتون است که تحت مجوز MIT منتشر شده است.

فلسفه SQLAlchemy این است که پایگاه داده های رابطه ای کمتر با مجموعه شی رفتار می کنند زیرا وقتی مقیاس بزرگتر می شود و نسبت به عملکرد نگرانی به وجود می آید، در حالی که در مجموعه های شی مانند جداول و ردیف ها به دلیل انتزاع بیشتر در آن ها، کمتر اتفاق می افتد. به همین دلیل، الگوی نقشه برداری داده ها (مشابه Hibernate برای جاوا) را به جای الگوی ضبط فعال که توسط تعدادی از نقشه برداران دیگر رابطه-شی مورد استفاده قرار گرفته، پذیرفته است. با این حال، افزونه های اختیاری به کاربران امکان می دهد با استفاده از نحو اعلانی توسعه یابند.

SQLAlchemy یک کتابخانه پایتون است که توسط Mike Bayer ایجاد شده است و اجازه می دهد تا توسعه دهندگان با پایگاه های داده (Postgres ،MySQL ،MS SQL و غیره) بدون نیاز به نوشتن کد خام اس کیوال در پوسته پایگاه داده، ارتباط برقرار کنند. همچنین یک ORM-Object Mapper را برای توسعه دهندگان فراهم می کند که اساسا بیشتر پایگاه داده را خلاصه می کند. شما در عوض می توانید جداول و فیلدها را با کلاس ها و متغیرهای نمونه تعریف کنید. SQLAlchemy یک جعبه ابزار متن باز پایگاه داده Python است که قابلیت های زیر را فراهم می کند:

  • نمایش پایگاه داده رابطه ای در آبجکت ها
  • مدیریت اتصالات پایگاه داده اپلیکیشن ها
  • ایجاد / تغییر طرح بندی پایگاه داده اگر مجاز باشد

SQLAlchemy پایگاه داده را نه فقط به عنوان مجموعه ای از جداول بلکه به عنوان یک موتور جبری رابطه ای در نظر می گیرد. ردیف ها را می توان از نه تنها از جداول بلکه همچنین از joins و دیگر statements انتخاب کرد. هر یک از این واحدها را می توان در یک ساختار بزرگتر قرار داد. SQLAlchemy به خاطر ORM محبوبیت دوچندانی دارد. هدف اصلی SQLAlchemy تغییر نحوه فکر کردن درباره پایگاه های داده و SQL است.

ویژگی های اس کیو ال الکمی (SQLAlchemy)

ویژگی های عمده SQLAlchemy عبارتند از:

یک ORM با مقاومت صنعتی، که هسته آن از روی نقشه هویت، واحد کار و الگوهای نقشه برداری داده ساخته شده است. این الگوهای امکان پایداری شفاف اشیاء با استفاده از یک سیستم پیکربندی اعلانی را می دهند. مدل های دامنه می توانند بصورت طبیعی ساخته و دستکاری شوند و تغییرات با معاملات فعلی بطور خودکار هماهنگ می شوند.

یک سیستم پرس و جو با محوریت رابطه ای، در معرض صریح طیف وسیعی از قابلیت های SQL، بطور صریح از جمله مدل پیوستگی، زیر سوال ها، همبستگی و سایر موارد دیگر. نوشتن با ORM از همان تکنیک های رابطه ای استفاده می کند که هنگام نوشتن SQL استفاده می کنید. در حالی که می توانید هر زمان که بخواهید به SQL کلمه ای بروید، تقریباً هرگز نیازی به این کار نیست.

سیستم جامع و انعطاف پذیر بارگذاری مشتاق برای مجموعه ها و اشیاء مرتبط وجود دارد. مجموعه ها در طی یک جلسه ذخیره می شوند و می توانند در دسترس باشند، همه در یک بار با استفاده از اتصالات، یا توسط پرس و جو در هر مجموعه در کل مجموعه نتایج کامل بارگیری شود.

یک سیستم ساخت و ساز Core SQL و لایه تعامل DBAPI. SQLAlchemy Core جداگانه از ORM است و یک لایه انتزاع کامل از پایگاه داده به خودی خود است و شامل یک زبان بیان گسترده SQL مبتنی بر پایتون، ابرداده های شماتیک، همبستگی اتصال، نوع اجبار و انواع سفارشی است.

فرض بر این است که کلیه محدودیت های اصلی و خارجی کلید کامپوزیت و طبیعی است. کلیدهای اصلی عدد صحیح صحیح هنوز هم عادی هستند، اما SQLAlchemy هرگز کد های سخت را برای این مدل فرض نمی کند. درون نگاری و تولید پایگاه داده. طرح های پایگاه داده را می توان "در یک مرحله به ساختارهای پایتون" نمایانگر ابرداده بانک اطلاعاتی "بازتاب داد. همین ساختارهای مشابه می توانند تابع های CREATE را درست عقب بکشند - همه در هسته، مستقل از ORM.

نحوه اتصال اس کیو ال الکمی (SQLAlchemy) به پایگاه داده

اس کیوال سرور (Microsoft SQL Server)

SQL Server رفتار به اصطلاح "افزایش خودکار" را با استفاده از ساختار IDENTITY فراهم می کند ، که می تواند روی هر ستون یک عدد صحیح در یک جدول قرار گیرد. SQLAlchemy هویت را در رفتار پیش فرض "autoincrement" خود برای یک ستون اصلی کلید صحیح ، که در Column.autoincrement شرح داده شده ، می داند. این بدان معناست که به طور پیش فرض ، اولین ستون اصلی کلید صحیح در یک جدول ستون هویت در نظر گرفته می شود و DDL را به این ترتیب تولید می کند:

from sqlalchemy import Table, MetaData, Column, Integer

m = MetaData()
t = Table('t', m,
        Column('id', Integer, primary_key=True),
        Column('x', Integer))
m.create_all(engine)

مثال بالا DDL را به صورت زیر تولید می کند:

CREATE TABLE t (
    id INTEGER NOT NULL IDENTITY(1,1),
    x INTEGER NULL,
    PRIMARY KEY (id)
)

پستگرس‌کیوال (PostgreSQL)

به منظور ذخیره داده ها در برنامه Flask ، ما می خواهیم از بانک اطلاعاتی استفاده کنیم. چندین نوع و طعم گزینه های پایگاه داده وجود دارد ، اما PostgreSQL با برنامه های پایتون بسیار محبوب شده است. در حالی که یک پایگاه داده ساده SQLite ممکن است کار با آن ساده تر باشد ، شروع به کار با پایگاه داده PostgreSQL انتقال به یک محیط تولید (یعنی اقیانوس دیجیتال) را آسان تر می کند.

در حالی که می توانید با استفاده از دستورات SQL به طور مستقیم PostgreSQL در تعامل باشید ، استفاده از Flask-SQLAlchemy برای تعامل با پایگاه داده در یک برنامه Flask بسیار ساده تر است. Flask-SQLAlchemy یک بستر فلاسک را در اطراف SQLAlchemy فراهم می کند ، که یک Mapper Relationship Mapper (ORM) برای نقشه برداری از جداول بانک اطلاعاتی به اشیاء پایتون است (کار با آن بسیار ساده تر است). به عنوان گذشته ، من فکر می کنم یادگیری اصول اولیه SQL بسیار مهم است ، زیرا می خواهید در یک مقطع به جزئیات سطح پایین پایگاه داده خود بپردازید.

اکنون که بسته Flask-SQLAlchemy نصب شده است ، زمان آن رسیده است که برنامه Flask را برای استفاده از Flask-SQLAlchemy پیکربندی کنید. با افزودن خطوط زیر به پرونده… / shembull / flask.cfg بر اساس کاربر ایجاد شده در پوسته pqsl ، شروع کنید:

# SQLAlchemy
SQLALCHEMY_DATABASE_URI = 'postgresql://<psql_username>:<psql_password>@localhost/flask_family_recipes_app'
SQLALCHEMY_TRACK_MODIFICATIONS = True

خط اول URI را به پایگاه داده جدید PostgreSQL تعریف می کند ، که به صورت محلی (localhost) ذخیره می شود و "flask_family_recipes_app" نامیده می شود.

گذشته از این ، اصطلاح "URI" غالباً به صورت مترادف با "URL" استفاده می شود ، که نادرست است. URI مخفف شناسه یکسان منابع است ، در حالی که URL مخفف Uniform Resource Locator است. URL واقعاً زیرمجموعه URI است ، همانطور که توسط نمودار عالی در این پست وبلاگ درباره URI vs URL نشان داده شده است. URI برای شناسایی یک منبع استفاده می شود که در این حالت یک پایگاه داده PostgreSQL است.

خط دوم به SQLAlchemy می گوید تغییرات را ردیابی کند ، که می خواهیم اتفاق بیفتد. این همچنین هشداری را با اجرای برنامه در مورد این پارامتر که به طور صریح مشخص نشده است ، سرکوب می کند.

در مرحله بعد ، در پرونده… / project / __ init__.py ، باید ماژول Flask-SQLAlchemy را وارد کنید و شیء Flask را به کلاس SQLAlchemy منتقل کنید تا هدف ‘db را ایجاد کنید:

#################
#### imports ####
#################
 
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
 
################
#### config ####
################
 
app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile('flask.cfg')
 
db = SQLAlchemy(app)
 
####################
#### blueprints ####
####################
 
from project.users.views import users_blueprint
from project.recipes.views import recipes_blueprint
 
# register the blueprints
app.register_blueprint(users_blueprint)
app.register_blueprint(recipes_blueprint)

 

مثال های اس کیو ال الکمی (SQLAlchemy)

مثال زیر بیانگر رابطه n-to-1 بین فیلم ها و کارگردانان آنها است. نشان داده شده است که چگونه کلاس های پایتون تعریف شده توسط کاربر جداول بانک اطلاعاتی مربوطه را ایجاد می کنند، چگونه نمونه هایی از روابط از هر طرف رابطه ایجاد می شوند و سرانجام چگونه می توان داده ها را پرس و جو کرد نشان دادن نمایش داده های SQL به صورت خودکار ایجاد شده برای بارگذاری تنبل و زرنگ.

تعریف شماتیک

ایجاد دو کلاس پایتون و جداول بانک اطلاعاتی در 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
نظرتون درباره این نوشته چیه؟ عالیه بد نیست خوب نبود