ruby,尝试将csv导入内存数据库的列数错误

时间:2014-09-17 14:57:08

标签: ruby sqlite csv sequel

当我尝试将数据从文件导入数据库进行测试时,我遇到了问题。以下代码完全按照我的预期在Ruby shell中执行:

jruby-1.7.4 :001 > require('sequel')
 => true
jruby-1.7.4 :002 > require('csv')
 => true
jruby-1.7.4 :003 > file = CSV.read('./spec/test_data/registration_sessions.csv')
 => [["01", "EG000000001"], ["02", "EG000000002"], ["03", "EG000000002"]]
jruby-1.7.4 :004 > db = Sequel.connect('jdbc:sqlite::memory:')
 => #<Sequel::JDBC::Database: "jdbc:sqlite::memory:">
jruby-1.7.4 :005 > db.create_table(:registration_sessions) do
jruby-1.7.4 :006 >   Integer :id
jruby-1.7.4 :007?>   String :device_serial
jruby-1.7.4 :008?> end
 => nil
jruby-1.7.4 :009 > db[:registration_sessions]
 => #<Sequel::JDBC::Dataset: "SELECT * FROM `registration_sessions`">
jruby-1.7.4 :010 > db[:registration_sessions].import(db[:registration_sessions].columns, file)
 => ["INSERT INTO `registration_sessions` (`id`, `device_serial`) VALUES ('01', 'EG000000001')", "INSERT INTO `registration_sessions` (`id`, `device_serial`) VALUES ('02', 'EG000000002')", "INSERT INTO `registration_sessions` (`id`, `device_serial`) VALUES ('03', 'EG000000002')"]
jruby-1.7.4 :012 > db[:registration_sessions].all
 => [{:id=>1, :device_serial=>"EG000000001"}, {:id=>2, :device_serial=>"EG000000002"}, {:id=>3, :device_serial=>"EG000000002"}]

但在我的测试中,事情并没有按预期发展:

let(:registration_metrics_db) { create_registration_metrics_db }
let(:session_seed_data) { CSV.read('./spec/test_data/registration_sessions.csv') }

before(:each) do
    seed_test_data(registration_metrics_db[:registration_sessions], session_seed_data)
end

def create_registration_metrics_db
  db = Sequel.connect('jdbc:sqlite::memory:')

  db.create_table(:registration_sessions) do
    Integer :id
    String :device_serial
  end

  db
end

def seed_test_data(table, data)
  table.import(table.columns, data)
end

当我运行测试时,会导致以下情况:

  14) RegistrationMetricsQueries #get_registration_metrics should return only durations for sessions that contain the start and end moment
     Failure/Error: seed_test_data(registration_metrics_db[:registration_sessions], session_seed_data)
     Sequel::Error:
       Different number of values and columns given to insert_sql
     # ./spec/services/tablet_usage_queries_spec.rb:88:in `seed_test_data'
     # ./spec/services/registration_metrics_queries_spec.rb:10:in `(root)'

  15) RegistrationMetricsQueries #get_registration_metrics should return durations in seconds for valid registration sessions, which contain the start and end moment
     Failure/Error: seed_test_data(registration_metrics_db[:registration_sessions], session_seed_data)
     Sequel::Error:
       Different number of values and columns given to insert_sql
     # ./spec/services/tablet_usage_queries_spec.rb:88:in `seed_test_data'
     # ./spec/services/registration_metrics_queries_spec.rb:10:in `(root)'

我做错了吗?

编辑:哦,我的样本数据

01,EG000000001
02,EG000000002
03,EG000000002

1 个答案:

答案 0 :(得分:0)

事实证明,问题是未能插入的结果。有一个表连接发生在引擎盖下,它导致Sequel锁定,因为sqlite不支持正确的连接。我正在迁移我的测试以使用实际的mysql数据库,而不是内存中的sqlite db。