gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:41:28 28 4
gpt4 key购买 nike

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,以便在更新命令完成之前 session 将根据更改进行更新。

最佳答案

以下是您发出 multi table update 的方法使用 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 中的脚注更新文档链接到核心多表更新文档:

The SQLAlchemy update() construct supports both of these modes implicitly, by specifying multiple tables in the WHERE clause

它也扩展到 ORM 查询 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 子句中隐式传递 FROM 表,例如查询 API 中的 filter()

实现

I'm wanting to use the ORM so that the session will be updated with the changes before the update command completes.

您必须更改 synchronize_session相应于'fetch''evaluate'

关于python - 如何在 SQLAlchemy ORM 中表达多表更新(UPDATE FROM)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42543223/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com