Pengalaman membuat aplikasi web dengan Pony ORM

Halo, Habr!


Baru-baru ini, saya mendapat tugas untuk menulis aplikasi web Python dengan Python untuk berbagi tagihan restoran di antara peserta makan. Karena kita membutuhkan DB untuk menyimpan data tentang pesanan dan pengguna, muncul pertanyaan memilih ORM untuk bekerja dengan database. Pengembangan dilakukan pada Flask, sehingga Django ORM segera tersapu dan pilihan awalnya jatuh ke arah SQLAlchemy. Di satu sisi, ORM ini hampir mahakuasa, tetapi karena ini, cukup sulit untuk dikuasai. Setelah menderita alkimia untuk sementara waktu, saya memutuskan untuk menemukan opsi yang lebih sederhana sehingga pengembangan akan berjalan lebih cepat. Akibatnya, Pony ORM dipilih untuk proyek tersebut.
gambar


, , . .


, . , , .


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


gambar


:


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.


Juga, seperti yang saya katakan di atas, pertanyaan dalam Pony dapat ditulis dalam ekspresi generator, yang membuat penulisan mereka jauh lebih nyaman daripada dalam alkimia.
Di bawah ini adalah contoh di mana database dikirim permintaan untuk memilih pengguna yang menjadi peserta dalam sesi ini dan bukan pengguna virtual.


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

Kesimpulan


Saya harap artikel saya bermanfaat bagi seseorang. Jika Anda juga tertarik pada Pony, di bawah ini saya akan meninggalkan tautan ke dokumentasi dan ke saluran telegram komunitas.


Terimakasih atas perhatiannya!


Dokumentasi Komunitas Pony
Telegram

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


All Articles