使用“insert_ignore”尝试使用Sequel gem执行multi_insert(或插入)。我得到一个未定义的方法错误。 表
DB = Sequel.connect('sqlite://database.db')
DB.create_table! :users do
primary_key :id
String :name, :default => nil, :unique => true
end
users = [{:name => 'bob'}, {:name => 'bob'}, {:name => 'mary'}]
DB[:users].insert_ignore.multi_insert(users)
返回
undefined method "insert_ignore" for <#Sequel::SQLite::Dataset: "SELECT * FROM 'users'"> (NoMethodError)
怎么了? SQLite3不支持insert_ignore语句吗? 困惑!
答案 0 :(得分:2)
SQLite3不支持insert_ignore语句吗?困惑!
Sequel::MySQL::DatasetMethods
的续集文档,其中包含:
列出方法insert_ignore(),但是Sequel :: SQLite :: Dataset的续集文档,它们在这里:
http://rdoc.info/github/evanfarrar/opensprints/Sequel/SQLite/Dataset
不列出该方法,并且您收到未定义的方法错误的事实是Sequel没有为sqlite实现insert_ignore()的好证据。
但是,根据这里的sqlite文档:
http://sqlite.org/lang_conflict.html
sqlite支持INSERT或IGNORE查询。所以,如果你想使用那个功能,看起来你将不得不使用原始sql和Sequel:
require 'sequel'
require 'sqlite3'
DB = Sequel.sqlite('mydb1.db')
DB.create_table! :users do
primary_key :id
String :name, :default => nil, :unique => true
end
#users = [{:name => 'bob'}, {:name => 'bob'}, {:name => 'mary'}]
my_insert =<<END_OF_QUERY
INSERT OR IGNORE INTO users(name) VALUES
('bob'),
('bob'),
('mary')
END_OF_QUERY
data_set = DB[my_insert]
data_set.insert
答案 1 :(得分:0)
你的方式有效,但我最终做了类似的事情:
record = DB[table.to_sym].where(data)
if 1 != record.update(data)
DB[table.to_sym].insert(data)
end
end
这样记录如果已经存在就会更新
答案 2 :(得分:0)
sequel
gem现已实施SQLite support for Dataset#insert_ignore
,已于2016年1月4日以版本4.30.0
发布。
升级到sequel
>= 4.30.0
应解决此问题。