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

有多个列的SQLAlchemy相关更新?

仲孙焱
2023-03-14
问题内容

这个问题已经在stackoverflow上被问过很多次了,但是它们似乎都已经存在了一年多,所以我想如果有更新的话我会再问一次。

Acorrelated update是一条更新语句,它根据另一个表中的值更新一个表中的所有行,同时将两个表链接在一起。

从SQLAlchemy文档中,我们可以轻松地进行相关更新,但仅在单个列上进行:

update(foo).values(bar=select([foobar.c.bar]).where(foobar.c.id == foo.c.id))

转换为:

UPDATE foo
SET bar = (
    SELECT bar
    FROM foobar
    WHERE foobar.id = foo.id
)

我们如何使用sqlalchemy中的多个列来编写相关更新?例如:

UPDATE foo
SET (bar, baz) = (
    SELECT bar, baz
    FROM foobar
    WHERE foobar.id = foo.id
)

问题答案:

根据您的头像和描述,我猜您正在使用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, exists

stmt = 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)


 类似资料:
  • 我继承了一个项目,它有一些CRUD形式...在创建表单中,我们需要创建一个和关系的条目。所以基本上我得到的是以下这些 我不确定这是否是最好的方法,但似乎有效。 我遇到的问题是,在表单中,这些参与者/评论可以编辑、添加或删除,我不确定如何更新它们。是否可以更新它们,或者删除现有关系数据并重新添加它们是否更好? 我从来没有更新过关系,只是添加了它们,所以我不确定如何开始。 任何帮助都将不胜感激。

  • 问题内容: SQLAlchemy支持渴望加载关系,这基本上是一条语句。但是,如果模型具有两个或多个关系,则可能是非常庞大的联接。例如, 该查询的性能实在是太差了,因为中和会产生一个巨大的表。但是和在这里没有关系,因此它们不应该是。它应该是两个分开的查询。并且由于会话具有某种程度的缓存,因此我将查询更改为此。 这次的性能要好得多。但是,我不认为这样做是正确的。我不确定会话结束时标签缓存是否会过期。

  • 我试图在这里创建一个描述和回答(用脚本)的依赖列表。 我想实现的是,如果从第1列的单元格中选择某个值(例如“First”),那么同一行下一个单元格中的下拉选项应提供不同表格中列的一系列值,这些列的标题与第一个左单元格中的值相同(即,第一个表格称为“Selector”)-其中有下拉列表,在第二张名为“KAT”的表格中,我有这些下拉列表的选项)。然后,根据行的每个第一个单元格的值,每一行都可以这样做。

  • 我已经根据这个脚本/教程创建了一个带有相关下拉列表的google工作表。这是我创建的工作表的副本。我的目标是使用下拉列表中的每个唯一值自动填充C列中的单元格,而不是创建一个与母版图纸C列中当前显示的下拉列表类似的下拉列表。我曾尝试通过VLOOKUP实现这一点,但只得到了错误的响应,可能是由于缺乏验证或其他我不熟悉的逻辑形式。如果A列或B列选项被修改,我还希望C列中的填充选项是清除的(clearCo

  • 更多资源 神经网络和深度学习入门教程 Jeff Dean 介绍 TensorFlow(视频) TensorFlow WhitePaper(PDF下载) Google官方Blog宣布TensorFlow开源 TensorFlow 简化版接口 Scikit Flow TensorFlow 使用样例 TensorFlow 与 mxnet, caffe 对比 @chenrudan 致谢 欢迎添加机器学习交

  • 我在Symfony2.8上遇到了一个多实体关系的问题。我有实体旅行,它可以由许多经验实体组成。 以下是我的旅行定义: 另一方面,我有经验实体: 在控制器中,用户可以生成一个新的行程,将对象置于会话中以调用它,直到真正的关联。 问题。在第一次通话时,它就像一个魔咒,添加experience\u trip条目,一切正常。在第二次调用时,具有不同经验的trip persisting正在寻找经验实体上的级