Ruby Sequel,“insert ignore”会返回未定义的方法吗?

时间:2014-07-14 21:47:50

标签: ruby database sqlite sequel

使用“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语句吗? 困惑!

3 个答案:

答案 0 :(得分:2)

  

SQLite3不支持insert_ignore语句吗?困惑!

Sequel::MySQL::DatasetMethods的续集文档,其中包含:

http://sequel.jeremyevans.net/rdoc-adapters/classes/Sequel/MySQL/DatasetMethods.html#method-i-insert_ignore

列出方法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应解决此问题。