рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рднреЛрдЬрди рдореЗрдВ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд░реЗрд╕реНрддрд░рд╛рдВ рдмрд┐рд▓ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдкрд╛рдпрдерди рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рдо рдорд┐рд▓рд╛ред рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдСрд░реНрдбрд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DB рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ORM рдЪреБрдирдиреЗ рдкрд░ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИред рд╡рд┐рдХрд╛рд╕ рдлреНрд▓рд╛рд╕реНрдХ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП Django ORM рддреБрд░рдВрдд рдмрд╣ рдЧрдпрд╛ рдерд╛ рдФрд░ рдкрд╕рдВрдж рд╢реБрд░реВ рдореЗрдВ SQLAlmhemy рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЧрд┐рд░ рдЧрдИ рдереАред рдПрдХ рдУрд░, рдпрд╣ рдУрдЖрд░рдПрдо рд▓рдЧрднрдЧ рд╕рд░реНрд╡рд╢рдХреНрддрд┐рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рдорд╛рд╕реНрдЯрд░ рдХрд░рдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдХреАрдорд┐рдпрд╛ рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдПрдХ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдЦреЛрдЬрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рд╡рд┐рдХрд╛рд╕ рддреЗрдЬреА рд╕реЗ рд╣реЛред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреЛрдиреА рдУрдЖрд░рдПрдо рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛ред

рдЗрд╕рдиреЗ рддреБрд░рдВрдд рдореБрдЭ рдкрд░ рдкреНрд░рд╣рд╛рд░ рдХрд┐рдпрд╛ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреАрдорд┐рдпрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдмреЛрдЭрд┐рд▓ рд╣реИред рд╕рд╛рде рд╣реА, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХрдо рд╕рдордп рдФрд░ рдХреЛрдб рдХреА рд▓рд╛рдЗрдиреЗрдВ рд▓рдЧрддреА рд╣реИрдВред
рдореИрдВрдиреЗ рдкреЛрдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕рдореАрдХреНрд╖рд╛ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдЯрдЯреНрдЯреВ рд▓рд╛рдн:
- рдХреНрд╡реЗрд░реА рд▓реЗрдЦрди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдЬрдирд░реЗрдЯрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
- рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреИрд╢рд┐рдВрдЧ
- рдкреВрд░реНрдг рд╕рдордЧреНрд░ рдХреБрдВрдЬреА рд╕рдорд░реНрдерди
рдореБрдЦреНрдп рджреЛрд╖ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рддрдВрддреНрд░ рдХреА рдХрдореА рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реВрдВрдЧрд╛ (рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдм рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ)
, , 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)
рдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рднреА рдкреЛрдиреА рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдиреАрдЪреЗ рдореИрдВ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд╕рдореБрджрд╛рдп рдХреЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж!
рдкреЛрдиреА рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХрдореНрдпреБрдирд┐рдЯреА рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди