Ruby - 创建本地数据库并检查行是否已存在

Ruby - Creating local database and checking if rows already exist

我正在使用“sequel”和“sqlite3”gem。

我用

创建了一个本地数据库
DB.create_table :numbers do
  primary_key :id
  String :important_number
end

我有一个每天插入数据库的数字列表,但在插入之前,我需要以某种方式检查数据库中是否已经存在这些记录。

正在使用

插入数据库
numbersFromAFile = Some Code
DB[:numbers].insert(:important_number => numbersFromAFile)

插入没有问题,但现在我需要一个 if 语句或其他东西来检查 important_number 是否已经存在。

所以像

if !DB[:numbers][:important_number] == numbersFromAFile
  DB[:numbers].insert(:important_number => numbersFromAFile)
else
  # do something else...
end

编辑:添加了唯一索引

DB.create_table? :numbers do
  String :important_number, unique: true
end

并使用

  if DB[:numbers].insert_conflict.insert(:important_number => numbersFromFile)
    DO SOMETHING
  else
    DO SOMETHING ELSE
  end

SQLite3 支持 INSERT 中的各种冲突解决方法,您可以从 sequel gem.

中利用这些方法

要使这些方法起作用,您必须在数据库模式中定义适当的唯一性约束,这样“重复”INSERT 会导致违反唯一性约束。根据您的示例,您可以在 important_number 列中定义一个唯一索引。

有了这个索引,您可以使用 INSERT OR IGNORE ... 语句指示 SQLite 忽略会导致此类违规的插入。

使用 sequel,您可以发出这样的语句:

DB[:numbers].insert_conflict.insert(:important_number => numbersFromAFile)

请参阅 insert_conflict 上的 the documentation 了解有关如何处理冲突的其他选项(例如更新现有记录)。

如果插入了新行,

insert 将 return 自动生成的 ID,如果未插入任何内容,则 nil。因此,您可以将替代操作实施为:

unless DB[:numbers].insert_conflict.insert(:important_number => numbersFromAFile)
  # do something else...
end