有多个列的SQLAlchemy相关更新?

有多个列的SQLAlchemy相关更新?,第1张

有多个列的SQLAlchemy相关更新

根据您的头像和描述,我猜您正在使用Oracle。如果您的联接产生了一个关键的保留视图,则可以从此答案中使用以下SQLAlchemy混合:

stmt = select([foo.c.bar.label('foo_bar'),    foo.c.baz.label('foo_baz'),    foobar.c.bar.label('foobar_bar'),    foobar.c.baz.label('foobar_baz')]).    where(foo.c.id == foobar.c.id)update(stmt).values({stmt.c.foo_bar: stmt.c.foobar_bar,          stmt.c.foo_baz: stmt.c.foobar_baz})

产生以下SQL:

UPDATE (SELECT foo.bar AS foo_bar,    foo.baz AS foo_baz,    foobar.bar AS foobar_bar,    foobar.baz AS foobar_baz        FROM foo, foobar        WHERe foo.id = foobar.id)SET foo_bar=foobar_bar, foo_baz=foobar_baz

标签很重要,因为您的表共享列名。

您还可以生成原始目标SQL:

from sqlalchemy import tuple_, select, existsstmt = select([foobar.c.bar, foobar.c.baz]).where(foo.c.id == foobar.c.id)foo.update().    values({tuple_(foo.c.bar, foo.c.baz).self_group(): stmt}).    where(exists(stmt))

self_group()
调用很重要,因为在这种情况下,编译器似乎省略了元组周围的括号,从而产生了不正确的语法。我添加了WHERe子句,以避免更新没有匹配的
foob​​ar的 foo 行: __

UPDATE foo SET (bar, baz)=(SELECT foobar.bar, foobar.baz FROM foobar WHERe foo.id = foobar.id) WHERe EXISTS (SELECt foobar.bar, foobar.baz FROM foobar WHERe foo.id = foobar.id)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5645489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存