gpt4 book ai didi

postgresql - AREL:使用 from 子句编写复杂的更新语句

转载 作者:行者123 更新时间:2023-11-29 13:31:18 26 4
gpt4 key购买 nike

我试图寻找一个使用 Arel::UpdateManager 来形成带有 from 子句的更新语句的示例(如 UPDATE t SET t.itty = "b"FROM .. .. WHERE ...), 找不到任何。按照我的看法,Arel::UpdateManager 将主引擎设置为初始化并允许设置要更新的各种字段和值。实际上有办法做到这一点吗?

另一个问题是找出如何将 Postgres posix 正则表达式匹配到 ARel 中,但现在这可能是不可能的。

最佳答案

据我所知 arel 的当前版本gem 不支持 FROM 关键字询问。您可以仅使用 SETWHERE 关键字生成查询,例如:

UPDATE t SET t.itty = "b" WHERE ...

和代码,它从 field2 复制一个值至 field1对于 units表,将像:

relation = Unit.all
um = Arel::UpdateManager.new(relation.engine)
um.table(relation.table)
um.ast.wheres = relation.wheres.to_a
um.set(Arel::Nodes::SqlLiteral.new('field1 = "field2"'))
ActiveRecord::Base.connection.execute(um.to_sql)

确切地说,您可以使用附加方法来更新关系。所以我们创建 Arel 的 UpdateManager ,分配给它的表,where子句和要设置的值。值 shell 作为参数传递给方法。然后我们需要添加 FROM生成的 SQL 的关键字请求,只有当我们可以通过 UPDATE 访问指定表的外部表时才添加它条款本身。最后我们执行查询。所以我们得到:

def update_relation!(relation, values)
um = Arel::UpdateManager.new(relation.engine)
um.table(relation.table)
um.ast.wheres = relation.wheres.to_a
um.set(values)
sql = um.to_sql

# appends FROM field to the query if needed
m = sql.match(/WHERE/)
tables = relation.arel.source.to_a.select {|v| v.class == Arel::Table }.map(&:name).uniq
tables.shift
sql.insert(m.begin(0), "FROM #{tables.join(",")} ") if m && !tables.empty?

# executes the query
ActiveRecord::Base.connection.execute(sql)
end

您可以将关系更新发布为:

values = Arel::Nodes::SqlLiteral.new('field1 = "field2", field2 = NULL')
relation = Unit.not_rejected.where(Unit.arel_table[:field2].not_eq(nil))
update_relation!(relation, values)

关于postgresql - AREL:使用 from 子句编写复杂的更新语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22501829/

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