۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

بهترین ORM ها برای برنامه های پایتون مبتنی بر پایگاه داده

برای انتخاب بهترین ORM پایتون برای پروژه های خود به کمک نیاز دارید؟ در اینجا آنچه شما باید در مورد SQLAlchemy، PonyORM، Django ORM، Peewee، SQLObject و Tortoise ORM بدانید آمده است.

برای انتخاب بهترین ORM پایتون برای پروژه های خود به کمک نیاز دارید؟ در اینجا آنچه شما باید در مورد SQLAlchemy، PonyORM، Django ORM، Peewee، SQLObject و Tortoise ORM بدانید آمده است.

وقتی می‌خواهید با یک پایگاه داده رابطه‌ای در Python یا اکثر زبان‌های برنامه‌نویسی دیگر کار کنید، معمولاً درخواست‌های پایگاه‌داده را با استفاده از دستور SQL که توسط اکثر پایگاه‌های داده پشتیبانی می‌شود، بنویسید.< /p>

با این حال، این رویکرد دارای معایبی است. استفاده از پرسش‌های SQL دست‌نویس می‌تواند ناشیانه باشد، زیرا پایگاه‌های داده و برنامه‌های نرم‌افزاری تمایل دارند در جهان‌های مفهومی جداگانه زندگی کنند. مدل‌سازی نحوه عملکرد برنامه و داده‌های شما با یکدیگر دشوار است.

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

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

۶ مورد از بهترین ORM ها برای پایتون

  • Django ORM
  • پیوی
  • PonyORM
  • SQLAlchemy
  • SQLObject
  • Tortoise ORM

جانگو

چارچوب وب Django دارای تمام چیزهایی است که برای ساختن وب‌سایت‌های حرفه‌ای نیاز دارید، از جمله ORM خودش. و ابزارهای مدیریت پایگاه داده اکثر افراد فقط از ORM جنگو با جنگو استفاده می کنند، اما اینطور است امکان استفاده از ORM به تنهایی وجود دارد. همچنین، ORM جنگو بر طراحی سایر ORMهای پایتون تأثیر زیادی گذاشته است، بنابراین نقطه شروع خوبی برای درک کلی ORMهای پایتون است.

مدل های پایگاه داده مدیریت شده توسط جنگو از الگوی مشابه سایر ORM ها در پایتون پیروی می کنند. جداول با کلاس های پایتون توصیف می شوند و انواع سفارشی جنگو برای توصیف فیلدها و رفتارهای آنها استفاده می شود. این شامل مواردی مانند ارجاعات یک به چند یا چند به چند با جداول دیگر است، اما همچنین انواعی که معمولاً در برنامه های کاربردی وب مانند فایل های آپلود شده یافت می شوند. همچنین می‌توان انواع فیلدهای سفارشی را با زیر کلاس‌بندی انواع موجود و استفاده از کتابخانه جنگو از روش‌های کلاس فیلد عمومی برای تغییر رفتارهای آنها ایجاد کرد.

نحوه کار با IAsyncDisposable در NET 6

ابزار مدیریت خط فرمان جنگو برای کار با سایت ها شامل ابزارهای قدرتمندی برای مدیریت لایه داده پروژه است. مفیدترین آنها به طور خودکار اسکریپت های مهاجرت را برای داده های شما ایجاد می کنند، زمانی که می خواهید مدل های خود را تغییر دهید و داده های اساسی را برای استفاده از مدل های جدید منتقل کنید. هر مجموعه تغییر به‌عنوان اسکریپت مهاجرت خود ذخیره می‌شود، بنابراین همه مهاجرت‌های یک پایگاه داده در طول عمر برنامه شما حفظ می‌شوند. این کار نگهداری برنامه‌های مبتنی بر داده را در جایی که طرح ممکن است در طول زمان تغییر کند، آسان‌تر می‌کند.

Peewee

Peewee دو ادعای بزرگ برای شهرت دارد. یکی، این یک کتابخانه کوچک اما قدرتمند است، حدود ۶۶۰۰ خط کد در یک ماژول واحد. دو، بدون اینکه پرمخاطب باشد گویا است. در حالی که Peewee به طور بومی تنها چند پایگاه داده را مدیریت می کند، آنها از رایج ترین پایگاه های داده هستند: SQLite، PostgreSQL، MySQL/MariaDB، و CockroachDB.

تعریف مدل‌ها و روابط در Peewee بسیار ساده‌تر از برخی ORM‌های دیگر است. یکی از کلاس‌های پایتون برای ایجاد جداول و فیلدهای آن‌ها استفاده می‌کند، اما Peewee برای انجام این کار به حداقل boilerplate نیاز دارد و نتایج بسیار خوانا و نگهداری آسان است. Peewee همچنین روش‌های ظریفی برای رسیدگی به موقعیت‌هایی مانند ارجاع کلید خارجی به جداول که بعداً در کد تعریف شده‌اند یا کلیدهای خارجی خودارجاعی دارد.

پرسش‌ها در Peewee از نحوی استفاده می‌کنند که به خود SQL گوش می‌دهد. برای مثال، Person.select(Person.name, Person.id).where(Person.age>۲۰). Peewee همچنین به شما امکان می‌دهد نتایج را به‌عنوان اشیاء غنی پایتون، به‌عنوان تاپل‌های نام‌گذاری شده یا دیکشنری‌ها، یا به‌عنوان یک تاپل ساده برای حداکثر کارایی بازگردانید. نتایج همچنین می توانند به عنوان یک مولد برای تکرار کارآمد در یک مجموعه ردیف بزرگ بازگردانده شوند. توابع پنجره و CTEها (Common Table Expressions) نیز پشتیبانی درجه یک دارند.

Peewee از بسیاری از استعاره های رایج پایتون فراتر از کلاس ها استفاده می کند. به عنوان مثال، تراکنش ها را می توان از طریق یک مدیر زمینه بیان کرد، مانند with db.atomic():. شما نمی توانید از کلیدواژه هایی مانند and یا not در پرس و جوها استفاده کنید، اما Peewee به شما امکان می دهد از عملگرهایی مانند & و ~ در عوض.

رفتارهای پیچیده مانند قفل کردن خوش بینانه و n اشیاء برتر در هر گروه به صورت بومی پشتیبانی نمی شوند، اما مستندات Peewee دارای یک مجموعه مفیدی از ترفندها برای اجرای چنین مواردی. مهاجرت طرحواره به صورت بومی پشتیبانی نمی‌شود، اما Peewee دارای یک API SchemaManager برای ایجاد مهاجرت‌ها همراه با سایر عملیات‌های مدیریت طرحواره است.

PonyORM

ویژگی برجسته

PonyORM روشی است که از سینتکس بومی پایتون و ویژگی‌های زبان برای نوشتن پرس و جو استفاده می‌کند. به عنوان مثال، PonyORM به شما امکان می‌دهد یک عبارت SELECT را به عنوان یک عبارت تولیدکننده بیان کنید: query = select (u برای u در User if u.name == "Davis").order_by(User.name ). همچنین می‌توانید از lambdas به‌عنوان بخش‌هایی از جستارها برای فیلتر کردن استفاده کنید، مانند query.filter(lambda user: user.is_approved is True). SQL تولید شده نیز همیشه در دسترس است.

وقتی جداول پایگاه داده را با اشیاء پایتون ایجاد می کنید، از یک کلاس برای اعلام رفتار هر فیلد ابتدا و سپس نوع آن استفاده می کنید. به عنوان مثال، یک فیلد name اجباری و مجزا name = Required(str, unique=True) خواهد بود. رایج‌ترین انواع فیلدها مستقیماً به انواع پایتون موجود مانند int/float/Decimal، datetime، bytes (برای داده‌های BLOB) و به زودی. یک نکته بالقوه سردرگمی این است که فیلدهای متنی بزرگ از نوع LongStr PonyORM استفاده می کنند. نوع str پایتون اساساً CHAR پایگاه داده زیربنایی است.

PonyORM به طور خودکار از انواع داده Array به سبک JSON و PostgreSQL پشتیبانی می کند، زیرا پایگاه داده های بیشتری اکنون هر دو نوع را به صورت بومی پشتیبانی می کنند. در مواردی که پشتیبانی بومی وجود ندارد، PonyORM اغلب می‌تواند موارد را تغییر دهد – برای مثال، نسخه‌های SQLite زودتر از ۳.۹ می‌توانند از TEXT برای ذخیره JSON استفاده کنند، اما نسخه‌های جدیدتر می‌توانند به صورت بومی از طریق یک ماژول افزونه کار کنند.< /p>

برخی از قسمت‌های PonyORM کمتر به اشیاء و نحو پایتون نزدیک می‌شوند. برای توصیف روابط یک به چند و چند به چند در PonyORM، از Set() استفاده می کنید، یک شی سفارشی PonyORM. برای روابط یک به یک، اشیاء Optional() و Required() وجود دارد.

PonyORM رفتارهای عقیدتی دارد که ارزش دانستن آنها را قبل از ساختن با آن دارد. پرس‌و‌جوهای ایجاد شده معمولاً دارای کلمه کلیدی DISTINCT هستند که به‌طور خودکار اضافه می‌شود، با این منطق که اکثر پرس‌و‌جوها به هر حال نباید تکراری را برگردانند. می توانید این رفتار را با روش .without_distinct() در یک پرس و جو لغو کنید.

یک حذف عمده از هسته PonyORM این است که هنوز هیچ ابزاری برای مهاجرت طرحواره وجود ندارد، اگرچه برای انتشار آینده برنامه ریزی شده است. از سوی دیگر، سازندگان PonyORM یک ویرایشگر طرحواره پایگاه داده آنلاین راحت را به عنوان یک سرویس با دسترسی اولیه به مجموعه ویژگی های رایگان و پیشرفته تر با قیمت ۹ دلار در ماه ارائه می دهند.< /p>

SQLAlchemy

SQLAlchemy یکی از شناخته شده ترین و پرکاربردترین ORMها است. کنترل قدرتمند و صریح تقریباً بر هر جنبه ای از مدل ها و رفتار پایگاه داده را فراهم می کند. SQLAlchemy 2.0 که در اوایل سال ۲۰۲۳ منتشر شد، یک API و سیستم مدل‌سازی داده جدید را معرفی کرد که به خوبی با سیستم‌های کلاسی و کلاس داده Python بازی می‌کند.

SQLAlchemy از یک معماری داخلی دو سطحی متشکل از Core و ORM استفاده می کند. Core برای تعامل با APIهای پایگاه داده و ارائه دستورات SQL است. ORM لایه انتزاعی است که مدل شی را برای پایگاه های داده شما ارائه می دهد. این معماری جدا شده به این معنی است که SQLAlchemy در تئوری می‌تواند از هر تعداد یا انواع لایه‌های انتزاعی استفاده کند، اگرچه جریمه عملکرد جزئی وجود دارد. برای مقابله با این، برخی از اجزای SQLAlchemy برای سرعت به زبان C (در حال حاضر Cython) نوشته شده‌اند.

SQLAlchemy به شما امکان می دهد طرحواره های پایگاه داده را به دو روش توصیف کنید، بنابراین می توانید مناسب ترین مورد را برای برنامه خود انتخاب کنید. شما می توانید از یک سیستم اعلامی استفاده کنید، جایی که اشیاء Table() را ایجاد می کنید و نام ها و انواع فیلدها را به عنوان آرگومان ارائه می کنید. یا می‌توانید کلاس‌ها را با استفاده از سیستمی که نحوه کار کلاس‌های داده را یادآوری می‌کند، اعلام کنید. اولی آسان‌تر است، اما ممکن است با ابزارهای پرزدار به خوبی بازی نکند. مورد دوم صریح تر و صحیح تر است، اما نیاز به تشریفات و تشریفات بیشتری دارد.

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

پرس و جو با SQLAlchemy از نحوی استفاده می کند که یادآور پرس و جوهای واقعی SQL است—به عنوان مثال، select(User).where(User.name == "Davis"). پرس‌و‌جوهای SQLachemy همچنین می‌توانند به‌عنوان SQL خام برای بازرسی، همراه با هرگونه تغییر مورد نیاز برای یک گویش خاص از SQL که توسط SQLAlchemy پشتیبانی می‌شود (به عنوان مثال، PostgreSQL در مقابل MySQL) ارائه شود. ابزار ساخت عبارت همچنین می تواند به تنهایی برای ارائه دستورات SQL برای استفاده در جاهای دیگر استفاده شود، نه فقط به عنوان بخشی از ORM. برای اشکال زدایی پرس و جوها، یک گزینه دستی echo=True به شما امکان می دهد عبارات SQL را هنگام اجرا در کنسول ببینید.

افزونه‌های SQLAlchemy مختلف ویژگی‌های قدرتمندی را اضافه می‌کنند که در هسته یا ORM. به عنوان مثال، افزونه “sharding افقی” به طور شفاف پرس و جوها را در چندین نمونه از یک پایگاه داده توزیع می کند. برای انتقال، پروژه Alembic به شما امکان می‌دهد اسکریپت‌های تغییر را با انعطاف‌پذیری و پیکربندی خوب ایجاد کنید.