sqlite3-rubyをCentOS5で使うときにはSQLite3をソースからインストールして使おう
さんざんハマっていて、調べてみたらさんざん既出だったけどメモとして残しておく。
sonots:blog CentOS5でrubyのsqlite3を使う に書いてある方法で解決出来ました。
@sonots++
要はこういうこと
sqlite3-ruby は SQLite 3.6.16 以降のバージョンとだけ互換性がある
http://rubygems.org/gems/sqlite3
Note that this module is only compatible with SQLite 3.6.16 or newer.
CentOS5 のリポジトリにある SQLite のバージョンは 3.3.6-6
状況
@sonots とは状況が違っていて、UNIQUE 制約をしているカラムに重複する内容を記録したときに、CentOS5 と CentOS6 では発生する例外が異なる
ということが起きていて困っていました。
例えばこんなコードを実行する
同じINSERT文を2回発行して、2回目の実行時に発生する例外クラスとメッセージを出力します。
#!/usr/bin/env ruby require "sqlite3" require "tmpdir" dbdir = Dir.mktmpdir("sqlite3") db = SQLite3::Database.new("#{dbdir}/test.db") db.execute(" CREATE TABLE IF NOT EXISTS combatants ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR NOT NULL UNIQUE )" ) sql = "INSERT INTO combatants (name) VALUES (?)" value = "studio3104" db.execute(sql, value) begin db.execute(sql, value) rescue => e puts e.class puts e.message end FileUtils.rm_rf(dbdir)
CentOS5
このような例外が発生します。コレは想定してないヤツ。
[studio3104@centos5 ~]$ ruby sqlite3test.rb SQLite3::SQLException SQL logic error or missing database
CentOS6
一方こちらではこのような例外が発生します。コイツが俺の求めていた例外です。
[studio3104@centos6 ~]$ ruby sqlite3test.rb SQLite3::ConstraintException column name is not unique
SQLite3 のバージョン
それぞれこのような感じです。
[studio3104@centos5 ~]$ sqlite3 -version 3.3.6
[studio3104@centos6 ~]$ sqlite3 -version 3.6.20
対策後
冒頭のリンクの通りに対策を行ったところ、想定通りの挙動をしてくれるようになりました。
めでたしめでたし。
[studio3104@centos5 ~]$ ruby sqlite3test.rb SQLite3::ConstraintException column name is not unique