PerlのフレームワークCatalystについての質問です。

http://naoya.dyndns.org/~naoya/mt/archives/001682.html
を参考に、最新のCatalyst5.7007で作ってみたところ、
$ script/ndo_tinyurl_create.pl model CDBI CDBI DBI:mysql:tinyurl nobody nobody
を入力した際に、
---
exists "/home/foo/NDO-TinyURL/script/../lib/NDO/TinyURL/Model"
exists "/home/foo/NDO-TinyURL/script/../t"
created "/home/foo/NDO-TinyURL/script/../lib/NDO/TinyURL/Model/CDBI.pm"
created "/home/foo/NDO-TinyURL/script/../lib/NDO/TinyURL/Model/CDBI"
---
となり、Urlmap.pm, cdbi_urlmap.tが生成されません。
そして、そのまま続けると、
$ script/ndo_tinyurl_server.pl
と、サーバを起動しようとしたところで、
---
Use of uninitialized value in hash element at /usr/local/share/perl/5.8.8/Class/DBI/Loader/Generic.pm line 77.
Couldn't instantiate component "NDO::TinyURL::Model::CDBI", "Can't call method "db_Main" on an undefined value at /usr/local/share/perl/5.8.8/Class/DBI/Loader/mysql.pm line 43.
at ./script/ndo_tinyurl_server.pl line 53" at ./script/ndo_tinyurl_server.pl line 53
Compilation failed in require at ./script/ndo_tinyurl_server.pl line 53.
---
と表示されてしまいます。(サーバが起動しません)

urlmapテーブルに対応したクラスが作られていないのが原因だと思うのですが、
なぜクラスが作られないのでしょうか?

perl 5.8.8, mysql 5.0.37です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/05/01 01:49:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:ablabo No.1

回答回数1ベストアンサー獲得回数0

ポイント10pt

$ script/ndo_tinyurl_create.pl model CDBI CDBI DBI:mysql:tinyurl nobody nobody

"create database tinyurl"でtinyurl"データベース"を作成されましたか?


$ script/ndo_tinyurl_create.pl model CDBI CDBI DBI:mysql:tinyurl nobody nobody

の例だとGenerics.pmはtinyurlデータベースに含まれる全てのテーブル情報を取得し、クラスを自動作成します。

たとえばsampleデータベースの中にaaa, bbb, cccというテーブルを作成し

$ script/ndo_tinyurl_create.pl model CDBI CDBI DBI:mysql:sample nobody nobody

としてヘルパースクリプトを実行させると、aaa, bbb, cccと、tinyurlデータベースに含まれる全てのテーブルのクラスを作成します。


ですのでtinyurlデータベースがあるかの確認と、その中にurlmapテーブルが存在するかの確認をしてみては。


generics.pmについては以前ブログに書いたのでよかったら(ABラボラトリ -初めてのPerl勉強中- - Catalystで使用テーブルを明示的に指定しない理由)。


それでも駄目なようでしたら、Catalyst の Catalyst::Helper::Model::CDBI でいつもハマる・・・orz :: Drk7jpこちらの記事の「その2」からの解決法を試してみてください。

  • id:hjapanman
    はじめてはてな使います。回答しよう!と思ったら回答できない、、
    回答締め切り後だったのですね。
    質問者がこれを見られていることを期待して、、、。
    私も全く同じメッセージで1日中悩んでおり、ネット中を這いずり
    回っておりました。先ほど解決したのでご報告します。

    わたしの環境は
    Catalyst5.7007(質問者と同じ)
    perl 5.8.8(質問者と同じ)
    mysql 4.1.20
    Class::DBI::Loader 0.32
    Class::DBI::Loader:mysql 0.30
    Class::DBI::Loader:Generic 0.30
    でした。

    結論から言いますと、下記より最新のClass::DBI::Loaderを
    CPANからダウンロードし、手動でインストールすれば解決
    しました。。
    http://search.cpan.org/~dmaki/Class-DBI-Loader-0.34/
    $ perl -MCPAN -e shell
    cpan> install Class::DBI::Loader
    でモジュールアップデートをしようとしても、CPAN.pmでは
    Class::DBI::Loaderはなぜかv.0.32を最新と判定されてして
    まうので解決に時間がかかりました。0.34にアップするには
    手動でインストールするしかないようです。
    (もしかしたらCPAN.pmの使用方法が悪いのかもしれませんが、、)


    原因は、
    Class::DBI::Loader:mysql
    Class::DBI::Loader:Generic
    Class::DBI::Loader
    間でうまく引数をやりとりできていなかったようです。
    これらのモジュールの整合性の問題かと思い、バージョンを
    最新に上げてみたら、うまくいった、という次第です。

    質問者の方もこれで解決されることを祈っております。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません