Studio3104::BLOG.new

uninitialized constant Studio3104 (NameError)

sqlite3-rubyをCentOS5で使うときにはSQLite3をソースからインストールして使おう

さんざんハマっていて、調べてみたらさんざん既出だったけどメモとして残しておく。 sonots:blog CentOS5でrubyのsqlite3を使う に書いてある方法で解決出来ました。
@++

要はこういうこと

sqlite3-rubySQLite 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

yumrpm からの依存があるので置き換えは危険。

状況

@ とは状況が違っていて、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