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
我正在使用“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