У нас есть приложение, которое использует sqlalchemy
в качестве ORM. Помимо таблиц сопоставления мы также используем его для сопоставления существующих представлений базы данных, что прекрасно работает.
Однако мы не можем найти простой способ сопоставления пользовательских запросов с моделями. Например, допустим, у нас есть отчет вроде:
q = session.query(
Table1.field1, Table2.field2, func.sum(Table2.field3).label('sum')
).join(
Table2, Table1.id == Table2.id
).filter(
Table1.field1 == param1, Table1.field2 == param2
).group_by(
Table1.field1, Table2.field2
)
Мы хотели бы сопоставить этот запрос с классом вроде
class Report(CustomBaseModel):
field1 = Column(Integer, primary_key=True)
field2 = Column(Integer, primary_key=True)
sum = Column(Numeric)
Наш CustomBaseModel
уже имеет множество функций реализовано, поэтому возможность использовать его здесь приведет к меньшему дублированию кода. Например, использование декларативной базы таким образом позволило бы определить relationship
s с другими таблицами.
Конечно, этот пример не работает, поскольку в базе данных нет выбираемого "report"
.
Я попытался установить __table__ = q.subquery()
в классе Report
. Таким образом, запрос работает, но невозможно определить столбцы, отношения или другие свойства. Возможно, есть лучший способ добиться этого.