適当な思いつきで書くブログ

UbuntuやPerlやJavaScriptやVimやZshやShellScriptやMySQLと戯れている中で適当な思いつきでやってみたことを書いています。

Cygwin環境でDBD::mysql使うときは+αでホストのIPアドレスを指定すればおkでした

引き続き、Web+DB Pressのvol.32にあるCatalystの特集でただいま"いろは"を勉強中です。

前回記事 Template::Toolkitを使ってみたんだけど生成されたMyApp::View::TT.pmがちょっと変?

今回はこんな感じのことをしてみました

  • myappのDBを作成
    • テーブルの作成
    • サンプルデータの挿入
  • CDBIモデルの生成(参考:リスト1)
  • myapp.ymlの初期設定(参考:リスト2)
  • テンプレートの作成

リスト1

$ perl script/myapp_create.pl model CDBI CDBI dbi:mysql:myapp root

リスト2

Model::CDBI:
  dsn: 'dbi:mysql:dbname=myapp'
  password: 'test1234'
  user: 'root'


この内容は [を] WEB+DB PRESS Vol.32 の Catalyst 入門記事のメモ さんのところが参考になります。というか参考にさせて頂いております。

DBD::nysqlはソケットで接続しようとするのでCygwinだとエラーになります><

リスト3

$ perl script/myapp_create.pl mode CDBI CDBI dbi:mysql:myapp user_name password

上記(リスト3)を実行すると、下記(リスト4)のように返ってくる。これだとNG。

リスト4

 exists "/home/tekiomo/MyApp/script/../lib/MyApp/Model"
 exists "/home/tekiomo/MyApp/script/../t"
 exists "/home/tekiomo/MyApp/script/../lib/MyApp/Model/CDBI.pm"
DBI connect('myapp','root',...) failed: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) at /usr/lib/perl5/site_perl/5.8/Class/DBI/Loader/mysql.pm line 92
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) at /usr/lib/perl5/site_perl/5.8/Class/DBI/Loader.pm line 87

このときの/lib/MyApp/Model/CDBI.pmは以下(リスト5)の通り。

リスト5

package MyApp::Model::CDBI;

use strict;
use base 'Catalyst::Model::CDBI';

__PACKAGE__->config(
    dsn           => 'dbi:mysql:myapp',
    user          => 'user_name',
    password      => 'password',
    options       => {},
    relationships => 1
);

修正対策(こうすればとりあえず動く)

Perl先生にお聞きしたところ、CygwinWindows間ではソケットが使えないのが原因。強制的にHOSTのIPアドレスを指定して接続する必要がある。とのこと。

  • /lib/MyApp/Model/CDBI.pm:リスト5の__PACKAGE__->config(...)をすべてコメント化
  • myapp.ymlをリスト6のようにhostのIPアドレスを指定する形に修正

リスト6

Model::CDBI:
  dsn: 'dbi:mysql:host=127.0.0.1;dbname=myapp'
  password: 'test1234'
  user: 'root'

これで起動できました。ありがとうございました。

そもそも"/lib/MyApp/Model/CDBI.pm"は自動で生成されるものなのだから、生成する際にIPアドレスを指定できるのでは?

ということで、もうちょっとがんばってみました。

CDBIモデルの生成を下記(リスト7)のように実行

リスト7

$ perl script/myapp_create.pl model CDBI CDBI dbi:mysql:myapp:127.0.0.1 user_name password

エラーもなく/lib/MyApp/Model/CDBI.pmが生成され、内容は下記(リスト8)の通りです。

リスト8

package MyApp::Model::CDBI;

use strict;
use base 'Catalyst::Model::CDBI';

__PACKAGE__->config(
    dsn           => 'dbi:mysql:myapp:127.0.0.1',
    user          => 'user_name',
    password      => 'password',
    options       => {},
    relationships => 1
);

"こいつ…動くぞ!!"

ということで、無事に起動できましたー(^ー^)

(感想)

ほえー疲れた…。