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

川原泰三 t_kawahara-osk @ sdcns.co.jp
2009年 11月 25日 (水) 15:02:29 JST


初めまして。川原と申します。
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 メーリングリストの案内