python - SQLalchemy - 从查询构建 ORM 模型
问题描述
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
课堂上设置。通过这种方式查询可以工作,但无法定义列、关系或其他属性。也许有更好的方法来实现这一点。
解决方案
我不太明白你想要实现什么样的行为,在这个例子中,表Report
存在但不需要,它是以简化的方式查询一些数据,my_query()
并my_query_session()
使用一个将其视为的包装器column
在您在查询中调用函数名称并输出结果的想法中。
@hybrid_property
不能不接受,*args
也愿意。**kwargs
@hybrid_method
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
from sqlalchemy.orm import sessionmaker
import sqlalchemy as sql
Base = declarative_base()
db_uri = 'sqlite:///test.db'
engine = sql.create_engine(db_uri)
Session = sessionmaker(bind=engine)
session = Session()
class Report(Base):
__tablename__ = 'report'
id = sql.Column(sql.Integer, primary_key=True)
name = sql.Column(sql.String(30), default='Unknown')
@hybrid_property
def my_query(self):
return self.name
@hybrid_method
def my_query_session(self, _session):
return _session.query(Report).order_by(
Report.id.desc()).first().name
if __name__ == '__main__':
Report.__table__.create(engine)
session.add(Report(name='Alex'))
session.add(Report(name='Nata'))
session.commit()
query_data = session.query(Report).first()
print(query_data.my_query)
print(query_data.my_query_session(session))
推荐阅读
- c# - 在 Blazor Webassembly 中完全完成 setInterval 的有效替代方法是什么?
- javascript - 标准组件交互机制 vs Vuex - 如何组合它们?
- debugging - 如何查看正在计算的值 pine Editor
- node.js - 刷新我的反应应用程序时出错
- python - 从由列表组成的 Pandas 列循环和累加总和
- c - 如何在解析中从 - 中检测 + 的标记
- r - R Shiny中带有输入函数的简单线性回归:eval的问题
- c++ - C++ 将 ULONG_PTR 转换为十六进制值数组
- scala - 如何在不使用数据集中的列名的情况下将 Dataframe 与一列数据集连接
- c++ - 如何从另一个线程中断 websocket(使用 boost beast)?