Erleben Sie das Erstellen einer Webanwendung mit Pony ORM

Hallo Habr!


Vor kurzem hatte ich die Aufgabe, eine Python-Webanwendung in Python zu schreiben, um eine Restaurantrechnung zwischen den Teilnehmern einer Mahlzeit zu teilen. Da wir eine Datenbank zum Speichern von Daten über Bestellungen und Benutzer benötigen, stellte sich die Frage, ob ORM für die Arbeit mit der Datenbank ausgewählt werden soll. Die Entwicklung wurde an Flask durchgeführt, so dass Django ORM sofort weggefegt wurde und die Wahl zunächst in Richtung SQLAlchemy fiel. Einerseits ist dieses ORM fast allmächtig, aber aus diesem Grund ist es ziemlich schwer zu meistern. Nachdem ich eine Weile unter Alchemie gelitten hatte, entschied ich mich für eine einfachere Option, damit die Entwicklung schneller vonstatten geht. Infolgedessen wurde Pony ORM für das Projekt ausgewählt.
Bild


, , . .


, . , , .


PonyORM:


  • ( lambda )

( )


, , 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 . , .


Bild


:


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.


Wie ich oben sagte, können Abfragen in Pony auch in Generatorausdrücken geschrieben werden, was das Schreiben viel bequemer macht als in der Alchemie.
Im Folgenden finden Sie ein Beispiel, in dem der Datenbank eine Anforderung zur Auswahl von Benutzern gesendet wird, die an dieser Sitzung teilnehmen und keine virtuellen Benutzer sind.


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

Fazit


Ich hoffe, mein Artikel hat jemandem geholfen. Wenn Sie sich auch für Pony interessieren, werde ich unten Links zur Dokumentation und zum Telegrammkanal der Community hinterlassen.


Vielen Dank für Ihre Aufmerksamkeit!


Pony- Telegramm-Community- Dokumentation

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


All Articles