Python 如何在SQLAlchemy ORM中表示多表更新(更新自)?

Python 如何在SQLAlchemy ORM中表示多表更新(更新自)?,python,sqlalchemy,Python,Sqlalchemy,我想使用ORM,以便在update命令完成之前使用更改更新会话。以下是使用ORM发出命令的方法: InvalidRequestError: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called 更新文档中的脚注链接到核心多表更新文档: SQLAlchemyupdate()构造通过在WHERE子句中指定多个表隐式支持这两

我想使用ORM,以便在update命令完成之前使用更改更新会话。

以下是使用ORM发出命令的方法:

InvalidRequestError: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called
更新文档中的脚注链接到核心多表更新文档:

SQLAlchemy
update()
构造通过在WHERE子句中指定多个表隐式支持这两种模式

这也扩展到了ORM查询API,这并不奇怪,因为ORM构建在核心之上。结果查询是:

session.query(Bar).\
    filter(Bar.status_id != 1,
           Bar.name == Foo.name,
           Foo.deleted_at.is_(None)).\
    update({Bar.status_id: 1}, synchronize_session=False)
从你的错误来看,我怀疑你有类似的想法

UPDATE bar SET status_id=%(status_id)s
FROM foo
WHERE bar.status_id != %(status_id_1)s
  AND bar.name = foo.name
  AND foo.deleted_at IS NULL
如错误所述,这是不可接受的。必须在WHERE子句中隐式传递FROM表,例如查询API中的
filter()

达到

我希望使用ORM,以便在update命令完成之前使用更改更新会话


您必须相应地将属性更改为
'fetch'
'evaluate'

以下是您使用ORM发布的方法:

InvalidRequestError: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called
更新文档中的脚注链接到核心多表更新文档:

SQLAlchemy
update()
构造通过在WHERE子句中指定多个表隐式支持这两种模式

这也扩展到了ORM查询API,这并不奇怪,因为ORM构建在核心之上。结果查询是:

session.query(Bar).\
    filter(Bar.status_id != 1,
           Bar.name == Foo.name,
           Foo.deleted_at.is_(None)).\
    update({Bar.status_id: 1}, synchronize_session=False)
从你的错误来看,我怀疑你有类似的想法

UPDATE bar SET status_id=%(status_id)s
FROM foo
WHERE bar.status_id != %(status_id_1)s
  AND bar.name = foo.name
  AND foo.deleted_at IS NULL
如错误所述,这是不可接受的。必须在WHERE子句中隐式传递FROM表,例如查询API中的
filter()

达到

我希望使用ORM,以便在update命令完成之前使用更改更新会话


您必须相应地将查询更改为
'fetch'
'evaluate'

您是否也可以包括您尝试使用的实际查询?您的示例也不完整,因为您不能对这些表使用ORM,因为它们缺少主键,除非您将名称作为候选键传递到表args中。我已将更大的表缩减到演示问题所需的最小值。您是否可以同时包含您尝试使用的实际查询?您的示例也不完整,因为您无法对这些表使用ORM,因为它们缺少主键,除非您将名称作为候选键传递到表args中。我已将更大的表缩减到演示问题所需的最小值。SqlAlchemy似乎不会自动执行这么多操作(例如,让我调用带别名的
),我忽略了它在filter语句中获取未连接表的能力。在我以前的工作中,
filter()中的隐式表引用实际上“咬”了我们一口
导致了一些严重的隐式交叉联接:P.需要注意的事情…SqlAlchemy似乎没有自动完成太多的工作(例如让我调用
别名
),以至于我忽略了它在filter语句中获取未连接表的能力。在我以前的工作中,我们实际上是“被咬了”通过
filter()
中的隐式表引用导致一些严重的隐式交叉连接:P.需要注意的事情。。。