Experiência na criação de um aplicativo Web com o Pony ORM

Olá Habr!


Recentemente, tive a tarefa de escrever um aplicativo Web Python no Python para compartilhar uma conta de restaurante entre os participantes de uma refeição. Como precisamos de um banco de dados para armazenar dados sobre pedidos e usuários, surgiu a questão de escolher o ORM para trabalhar com o banco de dados. O desenvolvimento foi realizado no Flask, então o Django ORM foi imediatamente varrido e a escolha inicialmente caiu na direção do SQLAlchemy. Por um lado, esse ORM é quase onipotente, mas, devido a isso, é bastante difícil de dominar. Depois de sofrer com a alquimia por um tempo, decidi encontrar uma opção mais simples para que o desenvolvimento fosse mais rápido. Como resultado, o Pony ORM foi escolhido para o projeto.
imagem


, , . .


, . , , .


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


imagem


:


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.


Além disso, como eu disse acima, as consultas no Pony podem ser escritas em expressões geradoras, o que torna muito mais conveniente escrevê-las do que na alquimia.
Abaixo está um exemplo no qual o banco de dados recebe uma solicitação para selecionar usuários participantes desta sessão e não usuários virtuais.


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

Conclusão


Espero que meu artigo tenha sido útil para alguém. Se você também estiver interessado em Pony, abaixo deixarei links para a documentação e o canal de telegrama da comunidade.


Obrigado pela atenção!


Documentação da comunidade Pony
Telegram

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


All Articles