handlename's blog

コード片など

Teng で on_connect_do したい場合

Tengをnewするときには、接続に必要な情報のほかに、オプションをいくつか渡すことができる。

で、そのオプションの中に on_connect_do というのがあって、その名のとおり、データベースに接続した際に実行するSQLを指定することができる。

on_connect_do の処理は Teng::connect() の中で行なわれているのだが、 new で dbh を渡すと Teng::connect() が呼ばれない(その時点で既に接続されているので)。
connect() が呼ばれないので on_connect_doで指定した処理は実行されない。

# これだとon_connect_doは実行されない
my $teng = Admin::DB->new(
    dbh => DBI->connect(
        'DBI:mysql:database=hoge;host=localhost;',
        'username',
        'password',
    ),
    [ on_connect_do => [ 'set names utf8' ] ]
);

dbh ではなく conenct_info を渡すようにすれば Teng::connect が呼ばれるので、 on_connect_do も実行される。

# これならon_connect_doが実行される
my $teng = Admin::DB->new(
    connect_info => [
        'DBI:mysql:database=hoge;host=localhost;',
        'username',
        'password',
    ],
    [ on_connect_do => [ 'set names utf8' ] ]
);

サンプルのとおり、DB内のマルチバイト文字が化けるのをなんとかしたいというのが目的だったのだけれど、 set names utf8 は使わないほうがいいらしい・・・。

libmysqlclientを使うプログラムはset namesをutf8であっても使ってはいけない | へぼい日記

理由はまだ把握できてない。