トップ «前の日記(2010年08月30日) 最新 次の日記(2010年09月02日)» 編集

Masa's blog

検索キーワード:

2010年08月31日 dbi-0.4.3.gem and sqlite3-ruby-1.2.5 works right, but sqlite3-ruby-1.3.1 dosen't [長年日記]

_ dbi-0.4.3.gem and sqlite3-ruby-1.2.5 works right, but sqlite3-ruby-1.3.1 dosen't

# gem install sqlite3-ruby-1.2.5.gem
# gem install dbi-0.4.3.gem
# gem install dbd-sqlite3-1.2.5.gem
# gem list

*** LOCAL GEMS ***

dbd-sqlite3 (1.2.5)
dbi (0.4.3)
sqlite3-ruby (1.2.5)

な環境だと

sql = <<SQL
    insert into member (id, name, job) values (?, ?, ?)
SQL
sth = dbh.prepare(sql)
sth.execute(1, '伊藤 太郎', 'サラリーマン')
sth.execute(2, '山田 太郎', '野球選手')
sth.finish

が問題なく実行できるが

# gem install sqlite3-ruby-1.3.1.gem
# gem install dbi-0.4.3.gem
# gem install dbd-sqlite3-1.2.5.gem
# gem list

*** LOCAL GEMS ***

dbd-sqlite3 (1.2.5)
dbi (0.4.3)
sqlite3-ruby (1.3.1)

な環境だと2発目の

sth.execute(2, '山田 太郎', '野球選手')

で以下のような

/usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.1/lib/sqlite3/statement.rb:41:in `bind_param': library routine called out of sequence (SQLite3::MisuseException)
        from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.1/lib/sqlite3/statement.rb:41:in `bind_params'
        from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.1/lib/sqlite3/statement.rb:37:in `each'
        from /usr/local/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.3.1/lib/sqlite3/statement.rb:37:in `bind_params'
        from /usr/local/lib/ruby/gems/1.8/gems/dbd-sqlite3-1.2.5/lib/dbd/sqlite3/statement.rb:71:in `bind_params'
        from /usr/local/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:115:in `execute'
        from ./test2.rb:86
        from /usr/local/lib/ruby/site_ruby/1.8/dbi/handles/database.rb:209:in `transaction'
        from ./test2.rb:76

例外が発生する。

コーディングを以下のように

sql = <<SQL
    insert into member (id, name, job) values (?, ?, ?)
SQL
sth = dbh.prepare(sql)
sth.execute(1, '伊藤 太郎', 'サラリーマン')
sth.finish
sth = dbh.prepare(sql)
sth.execute(2, '山田 太郎', '野球選手')
sth.finish

executeするたびにステートメントハンドルの廃棄/生成を行えば問題無く動くようだが、 dbi-0.4.3.gemはまだsqlite3-ruby-1.3.1に対応していないという事なのだろう。