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

标签 ruby postgresql sequel

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

相关文章:

ruby-on-rails - 无法在 Ubuntu 22.04 上安装 ruby​​ 版本 2.6.6

ruby - Curl 和 Net Http Ruby

javascript - 为什么 sequelize.sync() 不同步表,除非我将模态导入文件?

ruby - 续集 auto_validation 不检查字符串 maxlength

ruby - fork 时,Sequel 会断开与 SSL 错误的连接,为什么?

ruby-on-rails - 多级 block 方法正在产生问题

ruby - 如何将方法作为字符串传递并调用它

postgresql - 在 SELECT 查询中转换为自定义类型

java - Spring JPA ManyToOne 删除句柄

ruby - 如何让 Sequel 将列视为整数?