Experiencia creando una aplicación web con Pony ORM

Hola Habr!


Recientemente, tuve la tarea de escribir una aplicación web Python en Python para compartir una factura de restaurante entre los participantes en una comida. Como necesitamos una base de datos para almacenar datos sobre pedidos y usuarios, surgió la cuestión de elegir ORM para trabajar con la base de datos. El desarrollo se llevó a cabo en Flask, por lo que Django ORM fue barrido de inmediato y la elección inicialmente cayó en la dirección de SQLAlchemy. Por un lado, este ORM es casi omnipotente, pero debido a esto, es bastante difícil de dominar. Después de sufrir por un tiempo con la alquimia, decidí encontrar una opción más simple para que el desarrollo fuera más rápido. Como resultado, Pony ORM fue elegido para el proyecto.
imagen


, , . .


, . , , .


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


imagen


:


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.


Además, como dije anteriormente, las consultas en Pony se pueden escribir en expresiones generadoras, lo que hace que escribirlas sea mucho más conveniente que en alquimia.
A continuación se muestra un ejemplo en el que la base de datos recibe una solicitud para seleccionar usuarios que son participantes en esta sesión y no son usuarios virtuales.


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

Conclusión


Espero que mi artículo haya sido útil para alguien. Si también está interesado en Pony, a continuación dejaré enlaces a la documentación y al canal de telegramas de la comunidad.


¡Gracias por la atención!


Documentación de la comunidad de Pony
Telegram

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


All Articles