[pgsql-jp: 40071] Re: rubyから利用するとエラーが出るときがあります。

Nobuyuki Inaba nobuyuki.inaba @ gmail.com
2009年 11月 25日 (水) 16:26:00 JST


ありがとうございます! エラーが出ませんでした。

sth.execute(#{num})
の部分、を
sth.execute("#{num}")
とすれば、うまく行きました。
この様な使い方はどこを調べたらよいか教えていただけませんか?

このサンプル場合、値の変えたいのは、1ヶ所ですが、2ヶ所以上になったとき、
 sql = "INSERT INTO t01(key) values(?); "
 sql = "INSERT INTO t01(key,key2,key3) values(?ここはどうする); "
どうするといいか知りたいのです。

すみませんが教えてください。よろしくお願いします。




2009年11月25日15:02 川原泰三 <t_kawahara-osk @ sdcns.co.jp>:
> 初めまして。川原と申します。
> rubyの事は分からないのですが、「準備された文」=prepareが原因と
> 考えられますので、以下のように書き直しては如何でしょう?
>
>   for i in 0 .. 10000
>     num = rand(1000)
>     sql = "INSERT INTO t01(key) values(#{num}); "
>     sth = conn.prepare(sql)
>     sth.execute
>     puts i
>   end
>
>>
>   sql = "INSERT INTO t01(key) values(?); "
>   sth = conn.prepare(sql)
>   for i in 0 .. 10000
>     num = rand(1000)
>     sth.execute(#{num})
>     puts i
>   end
>
>> ----- Original Message -----
>> From: PostgreSQL Japanese Mailing List <pgsql-jp @ ml.postgresql.jp>
>> To: pgsql-jp @ ml.postgresql.jp
>> Sent: 2009/11/25 14:42:56
>> Subject: [pgsql-jp: 40068] rubyから利用するとエラーが出るときがあります。
>>
>> 稲葉と申します。
>> ここに質問してよいか悩みながら、困ったことが起きたのでメールさせていただき
> ます。
>>
>> OSはubuntu9.10を使っています。前のバージョンから、最近、9.10にしました。
>> そのせいで、使っていたデータベースはPostgreSQLが8.3から8.4になりました。
>> データベースを利用するのにrubyを利用しています。
>> 同じ質問をRubyの方にも出しています。
>>
>> 話をかんたんにするため、例を用意しました。
>> ---------------------------------------------------
>> #!/usr/bin/ruby
>> require 'dbi'
>>
>> begin
>>  conn = DBI.connect('DBI:PG:testdb:localhost', 'test01', '123456789')
>>  sql = "
>>    CREATE TABLE t01
>>    (
>>    id serial NOT NULL PRIMARY KEY,
>>    key integer
>>    );"
>>    sth = conn.prepare(sql)
>>    sth.execute
>>
>>    for i in 0 .. 10000        # ここが 10000 ではなく、100ぐらいだとエラー
> はでない。
>>      num = rand(1000)
>>      sql = "INSERT INTO t01(key) values(#{num}); "
>>      sth = conn.prepare(sql)
>>      sth.execute
>>      puts i
>>    end
>>
>> end
>> ------------------------------------------------------------------
>>
>> というプログラムを実行しますと、
>> 0
>> 1
>> ....
>> 890
>> 891
>> /usr/lib/ruby/1.8/dbd/pg/statement.rb:62:in `execute': ERROR:
>> 準備された文"ruby-dbi:Pg:70118378567060"はすでに存在します (DBI::Programmi
> ngError)
>>        from /usr/lib/ruby/1.8/dbi/handles/statement.rb:116:in `execute'
>>        from ich024-2.rb:19
>>        from ich024-2.rb:15:in `each'
>>        from ich024-2.rb:15
>>
>> と言うようにエラーが表示されます。
>> 以前のPostgreSQL8.3では出なかったと思いますが、このエラーメッセージはどう
> すればよいかわかりません。
>> また、
>> for i in 0 .. 10000
>> の部分を
>> for i in 0 .. 100
>> ぐらいだとエラーは出ません。
>> なにかまずいことしているとか、ごぞんじないでしょうか?
>> どこをうたがうとよいか正直分かりません。
>>
>> なにか、どこが問題なのか分かりましたら教えていただけないでしょうか?
>> 困ってます。
>>
>>
>
>



pgsql-jp メーリングリストの案内