【问题标题】:SqlAlchemy ORM and aggregate functionsSqlAlchemy ORM 和聚合函数
【发布时间】:2017-07-31 13:44:19
【问题描述】:

我正在使用 sqlalchemy ORM 从 Postgresql 数据库中获取数据,我想知道您是如何使用 sqlalchemy ORM 进行复杂查询的:

select table1.name, Array(select name from table2 join table3 using(id) where param1=6949)
from table1
where param1=6949

【问题讨论】:

  • 我认为您可能正在寻找的术语是“相关子查询”:docs.sqlalchemy.org/en/latest/core/… 我会给您举个例子,但从您写的内容来看,我不确定您要进行什么查询以及您的数据结构是什么。

标签: python postgresql orm sqlalchemy


【解决方案1】:

您可以将ARRAY constructorgeneric functions 一起使用。根据您映射表的方式,作为 ORM 模型或 Tables:

# ORM mappings here
stmt = session.query(Table2.name).\
    join(Table3, Table2.id == Table3.id).\
    filter_by(param1=Table1.param1)

query = session.query(Table1.name,
                      func.array(stmt.as_scalar())).\
    filter_by(param1=6949)

ARRAY 构造函数期望子查询生成单列。子查询必须作为表达式使用,也必须从 FROM 对象列表中删除,这可以使用 as_scalar() 完成。

一个具体的例子:

In [2]: class Table1(MagicBase):
   ...:     name = Column(Unicode)
   ...:     param1 = Column(Integer)
   ...:     

In [3]: class Table2(MagicBase):
   ...:     name = Column(Unicode)
   ...:     

In [4]: class Table3(MagicBase):
   ...:     param1 = Column(Integer)
   ...:     

In [5]: stmt = session.query(Table2.name).\
   ...:     join(Table3, Table2.id == Table3.id).\
   ...:     filter_by(param1=Table1.param1)
   ...: 
   ...: query = session.query(Table1.name,
   ...:                       func.array(stmt.as_scalar())).\
   ...:     filter_by(param1=6949)
   ...: 

In [6]: print(query)
SELECT table1.name AS table1_name, array((SELECT table2.name 
FROM table2 JOIN table3 ON table2.id = table3.id 
WHERE table3.param1 = table1.param1)) AS array_1 
FROM table1 
WHERE table1.param1 = %(param1_1)s

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2014-06-07
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多