在服务器之前捕获 Sequel ORM 中的约束错误

Trapping constraint errors in Sequel ORM before the server

我有一个 Ruby/Padrino 项目使用 Sequel ORM 来访问 MySQL 中的遗留数据库。我遇到的问题是 table 中的几个有一个用户 editable 列,它也是一个主键。

我正在尝试设置 Sequel 以在 MySQL 引发错误之前捕获应用程序本身内的任何重复错误。我假设 Sequel 中的验证助手可以帮助我做到这一点,但看起来它们在数据保存之前不会启动。

我的SQLtable定义为:

CREATE TABLE `dblocations` (
  `code` varchar(3) NOT NULL,
  `description` varchar(100) NOT NULL,
  PRIMARY KEY (`code`)
)

和我的Sequel模型定义如下:

class Location < Sequel::Model(:dblocations)
  plugins :validation_helpers
  def validate
    super
    validates_presence [:code, :description]
    validates_unique :code
  end
end

现在的问题是,当我尝试使用以下代码将位置代码 'ABC' 插入数据库时​​(当其中已经有代码 'ABC' 的另一行时),Ruby 抛出以下错误:

Location.insert(:code => "ABC", :description => "Test Location")

ERROR -  Mysql2::Error: Duplicate entry 'ABC' for key 'PRIMARY': INSERT INTO `dblocations` (`code`, `description`) VALUES ('ABC', 'Test Location')
Sequel::UniqueConstraintViolation: Mysql2::Error: Duplicate entry 'ABC' for key 'PRIMARY'

我是否错误配置了我的验证或者我需要调用另一个插件?

insert 是数据集级别的方法,验证是模型级别的。您可能想使用 create 而不是 insert.