我有一个名为product_model的表及其对应的ProductModel SQLAlchemy模型。
我希望将product_model表连接到select子查询,该查询只是取消两个PostgreSQL数组(产品模型ID和数量),然后将product_model表连接到此数据。数据来自简单的购物车(python dict)。我正在使用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;
我想在SQLAlchemy中对此SQL语句进行建模。这可能吗?我不知道如何加入一个不从表中选择的子查询。或者我需要寻找替代方案吗?
答案 0 :(得分:4)
不确定您的解决方案有多好,但以下是使用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)