Существует несколько способов организации кода.
1.Поместите все объекты в один файл
Это удобный способ для простых и средних проектов.Это самый простой и, вероятно, вы можете начать этот путь.Вы можете определить Database
объект в этом файле непосредственно перед определениями сущностей:
models.py
from pony.orm import Database, Required, Optional
db = orm.Database()
class Person(db.Entity):
name = Required(str)
addresses = Set('Address') # or Set(lambda: Address)
class Address(db.Entity):
street_name = Required(str)
persons = Set('Person')
main.py
from models import db, Person, Address
from settings import db_params
from pony.orm import db_session, select
db.bind(**db_params)
db.generate_mapping(create_tables=True)
with db_session:
persons = select(p for p in Person if p.age > 20)[:]
Этот способ прост и подходит для проектов среднего размера, вы можете начать с него
2.Определение сущностей внутри функции
Это может быть полезно, если вы хотите подключиться к нескольким различным экземплярам Database
в одной и той же программе
models.py
from pony.orm import Required, Optional
def define_entities(db):
class Person(db.Entity):
name = Required(str)
addresses = Set('Address')
class Address(db.Entity):
street_name = Required(str)
persons = Set('Person')
main.py
from models import define_entities
from settings import db_params
from pony.orm import Database, db_session, select
db = Database()
define_entities(db)
db.bind(**db_params)
db.generate_mapping(create_tables=True)
with db_session:
persons = select(p for p in db.Person if p.age > 20)[:]
Обратите внимание, что к классам сущностей можно обращаться как к свойствам объекта базы данных: db.Person
.Это может быть удобно, поскольку нет необходимости импортировать объект Person
- достаточно иметь доступ к объекту db
.Недостатком является то, что IDE, такие как PyCharm, не понимают, что такое db.Person
, и не дают предложений для завершения кода таких атрибутов, как Person.name
.
Также возможно разделить определения полномочий между несколькими функциями, которыеимпортируются из разных файлов:
models1.py
from pony.orm import Required, Optional
def define_entities(db):
class Person(db.Entity):
name = Required(str)
addresses = Set('Address') # or: Set(lambda: db.Address)
models2.py
from pony.orm import Required, Optional
def define_entities(db):
class Address(db.Entity):
street_name = Required(str)
persons = Set('Person') # or: Set(lambda: db.Person)
main.py
import models1, models2
from settings import db_params
from pony.orm import Database, db_session, select
db = Database()
models1.define_entities(db)
models2.define_entities(db)
db.bind(**db_params)
db.generate_mapping(create_tables=True)
with db_session:
persons = select(p for p in db.Person if p.age > 20)[:]
Это, вероятно, излишне, но иногда может использоваться для сменной архитектуры, когда точный набор сущностей определяется динамически после запуска приложения.
3.Определите сущности в отдельных файлах (не внутри функции)
Вы можете следовать схеме, описанной мной в соответствующем ответе: PonyORM - несколько файлов моделей