我有一个具有某种唯一约束的 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/