Python 使用SQLAlchemy使用子查询进行批量更新

Python 使用SQLAlchemy使用子查询进行批量更新,python,mysql,sql,sqlalchemy,nested-set-model,Python,Mysql,Sql,Sqlalchemy,Nested Set Model,我正在尝试使用SQLAlchemy实现以下MySQL查询。该表是嵌套的集合层次结构 UPDATE category JOIN ( SELECT node.cat_id, (COUNT(parent.cat_id) - 1) AS depth FROM category AS node, category AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt GR

我正在尝试使用SQLAlchemy实现以下MySQL查询。该表是嵌套的集合层次结构

UPDATE category
JOIN
    (
    SELECT
        node.cat_id,
        (COUNT(parent.cat_id) - 1) AS depth
    FROM category AS node, category AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    GROUP BY node.cat_id
    ) AS depths
ON category.cat_id = depths.cat_id
SET category.depth = depths.depth
这个很好用

这就是我开始拔头发的地方:

from sqlalchemy.orm import aliased
from sqlalchemy import func

from myapp.db import db

node = aliased(Category)
parent = aliased(Category)
stmt = db.session.query(node.cat_id,
                        func.count(parent.cat_id).label('depth_'))\
    .filter(node.lft.between(parent.lft, parent.rgt))\
    .group_by(node.cat_id).subquery()

db.session.query(Category,
                 stmt.c.cat_id,
                 stmt.c.depth_)\
    .outerjoin(stmt, 
               Category.cat_id == stmt.c.cat_id)\
    .update({Category.depth: stmt.c.depth_},
             synchronize_session='fetch')
…并且我得到
InvalidRequestError:此操作只需要将一个表或实体指定为目标
。在我看来,
Category.depth
充分地指定了目标,但当然,SQLAlchemy胜过了我的任何想法


难倒了。有什么建议吗?谢谢。

我知道这个问题已经问了五年了,但今天我偶然发现了。我的回答可能对其他人有用。我知道我的解决方案并不完美,但我没有更好的方法

我只需将最后一行更改为:

db.session.query(Category)\
    .outerjoin(stmt, 
               Category.cat_id == stmt.c.cat_id)\
    .update({Category.depth: stmt.c.depth_},
             synchronize_session='fetch')
然后,您必须提交更改:

db.session.commit()
这会发出以下警告:

SAWarning:将非映射列表达式“…”计算到ORM上 实例;这是一个不推荐使用的用例。请使用 ORM计算的更新/删除表达式中的实际映射列。
“更新/删除表达式。”%子句

为了摆脱它,我在本文中使用了解决方案:


注意:由于某些原因,别名在SQLAlchemy更新语句中不起作用。

您能在不使用
.subquery()
的情况下打印出
stmt
吗?您找到了吗?