تجربة إنشاء تطبيق ويب مع Pony ORM

مرحبا يا هابر!


في الآونة الأخيرة ، كان لدي مهمة كتابة تطبيق ويب Python في Python لمشاركة فاتورة مطعم بين المشاركين في الوجبة. نظرًا لأننا بحاجة إلى DB لتخزين البيانات حول الطلبات والمستخدمين ، فقد نشأ سؤال عن اختيار ORM للعمل مع قاعدة البيانات. تم تنفيذ التطوير على Flask ، لذلك تم التخلص من Django ORM على الفور وسقط الاختيار في البداية في اتجاه SQLAlchemy. من ناحية ، هذا ORM يكاد يكون كلي القدرة ، ولكن بسبب هذا ، من الصعب جدًا إتقانه. بعد معاناة الخيمياء لفترة من الوقت ، قررت أن أجد خيارًا أبسط حتى تسير عملية التطوير بشكل أسرع. ونتيجة لذلك ، تم اختيار Pony ORM للمشروع.
صورة


أدهشني على الفور أن بناء جملة كتابة الاستعلامات إلى قاعدة البيانات أقل تعقيدًا من الخيمياء. أيضًا ، تستغرق كتابة البرنامج وقتًا وخطوطًا أقل من التعليمات البرمجية.


قررت كتابة مقالة مراجعة قصيرة لمشاركة تجربتي باستخدام Pony. آمل أن يساعد المبرمجين المبتدئين إتقان تطوير التطبيقات التي تعمل مع قواعد البيانات بسرعة.


فوائد PonyORM:


  • تستخدم كتابة الاستعلام صيغة Python حصريًا (تعبيرات المولد أو وظائف لامدا)
  • التخزين المؤقت التلقائي للاستعلامات والكائنات
  • دعم مفتاح مركب كامل

بصفتي العيب الرئيسي ، أود أن أسلط الضوء على عدم وجود آلية ترحيل (يعمل المطورون الآن على هذا)


, , Pony , , .


Pony , .



pip Pony:


pip install pony

DB API :


  • PostgreSQL: psycopg psycopg2cffi
  • Oracle: cx_Oracle
  • MySQL: PyMySQL

Pony:


from pony.orm import *


— . .


db = Database()

. Database db.bind() . . SQLite ( ) PostgreSQL (). , Database. :


settings = dict(
    sqlite=dict(provider='sqlite', filename='pony.db', create_db=True),
    postgres=dict(provider='postgres', user='pony', password='pony', host='localhost', 
        database='pony')
)

:


db = Database(**settings['postgres'])


ER . , Python . , .


صورة


:


from datetime import datetime
from pony.orm import *

db = Database()

class User(db.Entity):
    id = PrimaryKey(int, auto=True)
    fullname = Optional(str)
    password = Optional(str)
    nickname = Optional(str)
    lended = Set('Credit', reverse='lender')
    borrowed = Set('Credit', reverse='borrower')
    credit_editions = Set('CreditEdition', reverse='user')
    sessions = Set('UserInSession')
    affected_editions = Set('CreditEdition', reverse='affected_user')

class Session(db.Entity):
    id = PrimaryKey(int, auto=True)
    title = Optional(str)
    start = Optional(datetime)
    end = Optional(datetime)
    ordereders = Set('OrderedItem')
    users = Set('UserInSession')

class OrderedItem(db.Entity):
    id = PrimaryKey(int, auto=True)
    session = Required(Session)
    title = Optional(str)
    price = Optional(int)
    user_in_sessions = Set('UserInSession')

class Credit(db.Entity):
    id = PrimaryKey(int, auto=True)
    lender = Required(User, reverse='lended')
    borrower = Required(User, reverse='borrowed')
    value = Optional(int)
    credit_editions = Set('CreditEdition')

class UserInSession(db.Entity):
    id = PrimaryKey(int, auto=True)
    user = Required(User)
    session = Required(Session)
    orders = Set(OrderedItem)
    value = Optional(int)

class CreditEdition(db.Entity):
    id = PrimaryKey(int, auto=True)
    user = Required(User, reverse='credit_editions')
    affected_user = Required(User, reverse='affected_editions')
    credit = Required(Credit)
    old_value = Optional(int)
    new_value = Optional(int)

db.generate_mapping()

, , .



( ). :


session = Session[sid]

Session , id == sid.


أيضًا ، كما قلت أعلاه ، يمكن كتابة الاستعلامات في المهر في تعبيرات المولد ، مما يجعل كتابتها أكثر ملاءمة من الخيمياء.
فيما يلي مثال على إرسال قاعدة البيانات لطلب لاختيار المستخدمين المشاركين في هذه الجلسة وليسوا مستخدمين افتراضيين.


users = select(u for u in User if u not in session.users.user and not u.virtual)

استنتاج


آمل أن تكون مقالتي مفيدة لشخص ما. إذا كنت مهتمًا أيضًا بـ Pony ، فسأترك أدناه روابط للوثائق وقناة برقية للمجتمع.


شكرا للانتباه!


توثيق مجتمع بوني
برقية

Source: https://habr.com/ru/post/undefined/


All Articles