当前位置: 首页 > 面试题库 >

您如何在SQLAlchemy ORM中表达多表更新(UPDATE FROM)?

燕宏胜
2023-03-14
问题内容

CREATE TABLE foo (
name text NOT NULL,
deleted_at timestamp without time zone
);

CREATE TABLE bar (
    name text NOT NULL,
    status_id int
);

UPDATE bar set status_id=1
FROM foo
WHERE status_id <> 1 AND foo.name = bar.name AND foo.deleted_at is null;

当我尝试使用ORM执行此操作时,我最终遇到此错误

InvalidRequestError: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called

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


问题答案:

使用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)

Query
API
文档中的脚注,用于指向Core多表更新文档的更新链接:

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

它也扩展到了ORM Query API,这并不奇怪,因为ORM是建立在Core之上的。结果查询为:

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

从您的错误中我怀疑您有一些类似的东西

session.query(Bar).select_from(Foo)...update(...)

由于错误状态而被接受。您必须在WHERE子句中(例如filter()在查询API中)隐式传递FROM表。

达到

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

您必须将相应地更改synchronize_session'fetch''evaluate'



 类似资料:
  • 问题内容: 如何使用Python文字将整数表示为二进制数? 我很容易找到十六进制的答案: 和八进制: 如何使用文字在Python中表示二进制? 答案摘要 Python 2.5及更早版本:可以使用,但不能使用文字来表示二进制。 Python 2.5和更早版本: 无法 表达二进制文字。 Python 2.6 beta:您可以这样做:或。 Python 2.6 beta:还将允许或(第二个字符为字母O)

  • 本文向大家介绍您如何在Cucumber中使用正则表达式?,包括了您如何在Cucumber中使用正则表达式?的使用技巧和注意事项,需要的朋友参考一下 我们可以在Cucumber中使用正则表达式来选择功能文件中相似语句的集合。 示例 功能文件 步骤定义文件具有@Given(“([^ \”] *)season $“)中的@Given时间表,该表在正则表达式的帮助下将两个Given语句映射到Feature

  • 我知道我可以在我的表单上创建一个绑定,以便能够访问和更新下表中的记录: 但这是通过从路由传递一个id来完成的 所以只有当我只需要向用户显示和更新一条记录/行时,这才有用。基本上就像一个博客条目,有一个标题,正文为一行。我只是想用户去的路线 /nav/edit/和它显示所有行的导航作为一个可编辑的输入发送回数据库。 我的问题是,如何从表中检索多行,并将它们的值显示到输入字段中,当用户编辑其字段时,这

  • 我有一个有大约200张幻灯片的PowerPoint演示文稿。每张幻灯片都有一个图表,其中的数据通过到主xlsx文件的链接每月更新一次。 为了不在图表中显示空值(未来月份),我打开数据编辑器(图表右键单击>Edit data...)并选择直到当前月份的范围。 我在PowerPoint中为它写了一个宏:

  • 问题内容: 在Hibernate中,可以在类路径的根目录中添加文件,并且在创建Hibernate会话时,将在数据库上执行该文件的SQL表达式。 但是,如果某些表达式分成两行或更多行,则Hibernate会引发异常。如何将SQL表达式分成更多行? 问题答案: 为了像我这样的人通过搜索找到此内容: 如果您使用的是Hibernate4,则可以添加以下属性 到您的hibernate配置(我的是JPA的)。

  • 问题内容: 我现在正在定义Django模型,我意识到模型字段类型中没有。我确定有办法做到这一点,所以我不确定我缺少什么。我基本上有这样的事情: 在这种情况下,每个可以有多个,但这种关系应该是单向的,因为我不需要从知道其拥有它本身,因为我可能有许多不同的对象自身的情况下,如为例: 我将用模型中的什么替换(不存在)以表示这种关系?我来自Hibernate / JPA,在这里声明一对多关系非常简单: 如