前提・実現したいこと
Debian GNU/Linux 10.2.0(amd64)で、古いRuby(1.8.7)で書かれたコードを動かそうとしています。
対象のコードはDBIライブラリを使って、Postgresqlにアクセスするものです。
rbenvを使ってRuby 1.8.7の環境を作り、対象のコードを動かそうとしていますが、dbd-pgライブラリでundefined methodエラーが発生してうまく動作できません。
構築した環境は次のとおりです。
$ rbenv version 1.8.7-p375 (set by /home/hoge/Tmp/rubytest/.ruby-version) $ ruby -v ruby 1.8.7 (2013-12-22 patchlevel 375) [x86_64-linux] $ gem list *** LOCAL GEMS *** dbd-pg (0.3.9) dbi (0.4.5) deprecated (2.0.1) pg (0.9.0)
発生している問題・エラーメッセージ
dbd-pgのdatabase.rbのload_type_map関数でundefined methodエラーが発生します。
/home//.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/dbd-pg-0.3.9/lib/dbd/pg/database.rb:392:in `load_type_map': undefined method `[]' for DBI::Type::Varchar:Class (NoMethodError) from /home/hoge/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/dbd-pg-0.3.9/lib/dbd/pg/database.rb:391:in `each_key' from /home/hoge/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/dbd-pg-0.3.9/lib/dbd/pg/database.rb:391:in `load_type_map' from /home/hoge/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/dbd-pg-0.3.9/lib/dbd/pg/database.rb:77:in `initialize' from /home/hoge/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/dbd-pg-0.3.9/lib/dbd/Pg.rb:157:in `new' from /home/hoge/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/dbd-pg-0.3.9/lib/dbd/Pg.rb:157:in `connect' from /home/hoge/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/dbi-0.4.5/lib/dbi/handles/driver.rb:33:in `connect' from /home/hoge/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/dbi-0.4.5/lib/dbi.rb:148:in `connect' from ./test1.rb:15
該当のソースコード
以下の単純なコードで試しています。
Ruby
1require "rubygems" 2require "dbi" 3 4# PostgreSQLサーバアドレス (初期値:"localhost") 5$SqlAddress = "localhost" 6# PostgreSQLサーバポート番号 (初期値:5432) 7$SqlPort = 5432 8# PostgreSQL一般ユーザ名 (初期値:"xxxxx") 9$SqlUserName = "xxxxx" 10# PostgreSQLデータベースパスワード(初期値:"xxxxx") 11$SqlPassword = "xxxxx" 12# PostgreSQLデータベース名 (初期値:"xxxxx") 13$SqlDbName = "xxxxx" 14 15dbh = DBI.connect( sprintf( "DBI:Pg:database=%s;host=%s;port=%s", $SqlDbName, $SqlAddress, $SqlPort), $SqlUserName, $SqlPassword) 16 17dbh.do("INSERT INTO test VALUES ('test1','test2')") 18dbh.commit 19 20dbh.disconnect
このコードのDBI.connect部分でエラーが発生しています。
database.rbのload_type_map関数は次のようなものです。
Ruby
1 # 2 # Gathers the types from the postgres database and attempts to 3 # locate matching DBI::Type objects for them. 4 # 5 def load_type_map 6 @type_map = Hash.new 7 8 res = _exec("SELECT oid, typname, typelem FROM pg_type WHERE typtype IN ('b', 'e')") 9 10 res.each do |row| 11 rowtype = parse_type_name(row["typname"]) 12 @type_map[row["oid"].to_i] = 13 { 14 "type_name" => row["typname"], 15 "dbi_type" => 16 if rowtype 17 rowtype 18 elsif row["typname"] =~ /^_/ and row["typelem"].to_i > 0 then 19 # arrays are special and have a subtype, as an 20 # oid held in the "typelem" field. 21 # Since we may not have a mapping for the 22 # subtype yet, defer by storing the typelem 23 # integer as a base type in a constructed 24 # Type::Array object. dirty, i know. 25 # 26 # These array objects will be reconstructed 27 # after all rows are processed and therefore 28 # the oid -> type mapping is complete. 29 # 30 DBI::DBD::Pg::Type::Array.new(row["typelem"].to_i) 31 else 32 DBI::Type::Varchar 33 end 34 } 35 end 36 # additional conversions 37 @type_map[705] ||= DBI::Type::Varchar # select 'hallo' 38 @type_map[1114] ||= DBI::Type::Timestamp # TIMESTAMP WITHOUT TIME ZONE 39 40 # remap array subtypes 41 @type_map.each_key do |key| 42 if @type_map[key]["dbi_type"].class == DBI::DBD::Pg::Type::Array 43 oid = @type_map[key]["dbi_type"].base_type 44 if @type_map[oid] 45 @type_map[key]["dbi_type"] = DBI::DBD::Pg::Type::Array.new(@type_map[oid]["dbi_type"]) 46 else 47 # punt 48 @type_map[key] = DBI::DBD::Pg::Type::Array.new(DBI::Type::Varchar) 49 end 50 end 51 end 52 end
このコードの # remap array subtypes 部分でエラーが出ているようです。
試したこと
まったく原因を追えない状況です。
下記のようなキーワードでGoogle検索してみましたが、これといったページにあたりませんでした。
- database.rb load_type_map undefined method
- ruby DBI undefined method
- ruby load_type_map undefined method
- ruby DBI::Type::Varchar:Class NoMethodError
補足
Postgresqlのバージョンは11.7です、新しすぎでしょうか?
$ psql --version psql (PostgreSQL) 11.7 (Debian 11.7-0+deb10u1)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/18 10:19