SQLAlchemy:加入没有 from 字段的子查询

tan*_*0th 4 python sql orm sqlalchemy flask-sqlalchemy

我有一个名为 Product_model 的表及其相应的 ProductModel SQLAlchemy 模型。

我希望将product_model 表加入到一个选择子查询中,该查询只需取消嵌套两个PostgreSQL 数组(产品模型id 和数量),然后将product_model 表加入到该数据中。数据取自一个简单的购物车(Python 字典)。我在这个用例中使用 PostgreSQL,但是如果存在更好的想法,我将非常乐意使用替代方案。

在 SQL 中,这将如下所示(此语句计算购物车中所有产品的总质量):

SELECT SUM(p.mass * c.quantity) FROM product_model AS p
INNER JOIN (
  SELECT UNNEST(ARRAY[1]) AS model_id, UNNEST(ARRAY[2]) AS quantity
) AS c ON p.id = c.model_id
GROUP BY p.id;
Run Code Online (Sandbox Code Playgroud)

我想在 SQLAlchemy 中对该 SQL 语句进行建模。这可能吗?我不确定如何连接到不从表中选择的子查询。或者我需要寻找替代方案?

Aud*_*kas 5

不确定您的解决方案有多好,但以下是如何使用 SQLAlchemy 编写 SQL 查询:

from sqlalchemy.dialects.postgresql import array

# First write the subquery.  array() function is used for Pg ARRAY literals.
subq = db.session.query(
    db.func.unnest(array([1])).label('model_id'),
    db.func.unnest(array([2])).label('quantity')
).subquery()

# Now when you have the subquery, you can use it as if it were a Table object.
q = db.session.query(db.func.sum(ProductModel.mass * subq.c.quantity)).\
    join(subq, ProductModel.id == subq.c.model_id).\
    group_by(ProductModel.id)
Run Code Online (Sandbox Code Playgroud)