gpt4 book ai didi

ruby - 在 sequel/ruby 中难以捕获 postgresql 异常

转载 作者:行者123 更新时间:2023-11-29 13:07:20 25 4
gpt4 key购买 nike

我有一个具有某种唯一约束的 postgresql 表。

我有 ruby​​ 脚本可以更新这个表。ruby 脚本应该能够切换到 UPDATE 而不是 INSERT出现这种错误时:
PGError:错误:重复的键值违反了唯一约束

CMIIW,sequel 好像不能捕获这个异常??

无论如何,下面的示例代码是我希望看到的,但显然不是:

@myarray.each do |x|
fresh_ds = DB["INSERT INTO mytable (id, col_foo) values ('#{x}' ,'#{myhash[x]}')"]
result = fresh_ds.insert

catch Sequel::Error do

fresh_ds = DB["UPDATE mytable set col_foo = '#{myhash[x]} where id = #{x}"]
result = fresh_ds.update

end

end

也许我的 ruby​​ 代码有误,或者我遗漏了一些我不知道的东西。
有什么解决办法吗?
谢谢。

更新:下面的代码有效,当违反唯一约束时会捕获错误。

@myarray.each do |x|
begin
# INSERT CODE
rescue Sequel::Error
# UPDATE CODE
end

end

最佳答案

首先,Ruby 中的 try-catch goes like this :

begin
...
rescue ExceptionClass => ex
...
end

另一件事是你应该使用 Sequel 的参数插值而不是手动进行整个查询(主要是因为 SQL 注入(inject)):

fresh_ds = DB["INSERT INTO mytable (id, col_foo) values (? ,?)", x, myhash[x]]

附言:

正如其他人已经指出的那样,还有其他可以说是更好的方法来执行“插入或更新”。通常,异常意味着,呃,异常,即在执行过程中通常不应该发生的情况。你的情况更多的是 if 排序,所以我要么先使用 SELECT 检查行是否已经存在,要么先尝试 UPDATE并查看更改的行数,如果为零,则执行 INSERT

关于ruby - 在 sequel/ruby 中难以捕获 postgresql 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4681527/

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