DBIx::Class::Schema::Loaderでダンプさせたやつが変わってて(´(・)`)クマッタ・・[Oracle]
スキーマが変わったのでダンプさせたら
-__PACKAGE__->load_components("PK::Auto", "Core"); +__PACKAGE__->load_components("Core"); - { - data_type => "TIMESTAMP(6)", - default_value => undef, - is_nullable => 1, - size => 11, - },
こんな差分になってた。
「data_typeがTIMESTAMPだったらinflate_column仕掛ける」ってのをやっていたのに、できなくなってしまったではないか。
DBIx::Class::Schema::Loader::DBI::OracleがDBIx-Class-Schema-Loaderにマージされたから?とか思ってDBIx-Class-Schema-Loader-DBI-Oracleとの差分を見たけど特に変わったところは無かった。
DBIx::Class::Schema::Loader::DBI#_columns_info_forがちゃんと動いてないのかな?これは結構(´(・)`)クマッタ・・
自分の環境- DBIx-Class-Schema-Loader-0.04000
- DBD-Oracle-1.19
DBIx-Class-Schema-LoaderのChangesを見ると、columns_info_forというメソッドをDBIx::Class::Storage::DBI(DBIx-Class)からDBIx::Class::Schema::Loader::DBI(DBIx-Class-Schema-Loader)へ移動しているのだけれども、その過程でエンバグしてるっぽいです。DBIx-Class-Schema-Loader-0.03999_01から起きると思います。
DBIx::Class::Storage::DBIの場合、その具象クラスであるDBIx::Class::Storage::DBI::Oracle#columns_info_forでsub columns_info_for { my ($self, $table) = @_; $self->next::method(uc($table)); }
と、テーブル名をUpperCaseにしています。 しかしDBIx::Class::Schema::Loader::DBIの場合はUpperCaseにせずにそのままのテーブル名で$dbh->column_infoを呼んでしまっており、それが原因となっているようです。
DBIx-Class-Schema-Loaderの方にパッチを当てる場合% diff DBIx/Class/Schema/Loader/DBI.pm.orig DBIx/Class/Schema/Loader/DBI.pm --- DBIx/Class/Schema/Loader/DBI.pm.orig 2007-06-12 23:32:51.906250000 +0900 +++ DBIx/Class/Schema/Loader/DBI.pm 2007-06-12 23:42:32.546875000 +0900 @@ -211,7 +211,7 @@ if ($dbh->can('column_info')) { my %result; eval { - my $sth = $dbh->column_info( undef, $self->db_schema, $table, '%' ); + my $sth = $dbh->column_info( undef, $self->db_schema, uc $table, '%' ); $sth->execute(); while ( my $info = $sth->fetchrow_hashref() ){ my %column_info;もしくは、DBD-Oracleの方にパッチを当てる場合
% diff DBD/Oracle.pm.orig DBD/Oracle.pm --- DBD/Oracle.pm.orig 2007-06-12 23:34:24.562500000 +0900 +++ DBD/Oracle.pm 2007-06-12 23:34:33.562500000 +0900 @@ -490,7 +490,7 @@ sub column_info { my $dbh = shift; my $attr = ( ref $_[0] eq 'HASH') ? $_[0] : { - 'TABLE_SCHEM' => $_[1],'TABLE_NAME' => $_[2],'COLUMN_NAME' => $_[3] }; + 'TABLE_SCHEM' => $_[1],'TABLE_NAME' => uc $_[2],'COLUMN_NAME' => $_[3] }; my($typecase,$typecaseend) = ('',''); if (ora_server_version($dbh)->[0] >= 8) { $typecase = <<'SQL';どちらも、ちゃんとcolumn_infoが出てくるようになりました。
DBD-Oracleの方にパッチ当てるのが筋かなあと思いますし、元々DBD-Oracleにはパッチを当てて使っているのでとりあえず後者を採用することにしました。
何か問題があったらまた考える。