MySQLとの連携
Perlで「MySQL」を利用する方法を解説します。
DBIとDBIの解説
まずMySQLを扱う基本的な知識として、DBIとDBIというものについて解説します。プログラムからデータベースに接続する場合は、DBIというものを使用するのが一般的です。また実際のRDBMSとのやりとりは、DBDを通して行われます。
さまざまなRDBMSを利用できる共通のAPI DBI
DBIとは、RDBMS(リレーショナルデータベース管理システム)に依存しないAPIのことです。( DBIは、Database Interface の略 )
RDBMSには、MySQL、Oracle,DB2,Postgre SQLなどがありますが、別々の人が作ったものですので、利用方法は少しづつ異なります。DBIを使用すれば、異なるベータベースに共通の記述で、接続したり、SQLをリクエストしたりできます。
データベースに接続するための関数群 DBI
Perlに同名のモジュールがあるのでインストールします。
cpan DBI
RDBMSと実際にやり取りを行うドライバ DBD
DBIは関数を提供しますが、実際は内部でDBDがデータベースとやり取りを行っています。DBDには、MySQL用、PostgreSQL用、Oracle用,SQLite用などさまざまな種類があります。
MySQL用のDBDをインストールします。MySQLがインストールされていることが必要です。
cpan DBD::mysql
DBIとDBDとデータベースサーバのやり取りのイメージ
DBIというのは、どのデータベースに接続するときも変わりません。DBIはデータベースに依存しないように作られた接続のための関数の集まりだからです。DBDというのが、データベースと実際にデータをやり取りをします。
|-----| |-------------| |-------------| | | | | | | | |-------| DBD::mysql |---------| MySQL | | | | | | | | | |-------------| |-------------| | DBI | | | |-------------| |-------------| | | | | | | | |-------| DBD::Oracle |---------| Oracle | | | | | | | |-----| |-------------| |-------------|
MySQLサーバーへ接続する
MySQLサーバに接続するにはconnectメソッドを使用します。
use DBI; my $dbh = DBI->connect("DBI:mysql:$database", $user, $password);
リモートのMySQLサーバに接続するには、ホスト名を指定して
use DBI; my $dbh = DBI->connect( "DBI:mysql:$database:$hostname", $user, $password );
のようにします。
ポート番号も指定することができます。
use DBI; my $dbh = DBI->connect( "DBI:mysql:$database:$hostname:$port", $user, $password );
データベースハンドル
connectメソッドは、データベースの操作に利用するデータベースハンドルというものを戻り値に返却します。
データベースハンドルを使用して、MySQLサーバとやり取りします。
エラー処理
データベース名が間違っていたり、パスワードが間違っていたり、何らかの理由でデータベースに接続できない場合は、戻り値にundefが返却されます。そのときのエラーの内容は、
$DBI::errstr;
で取得できます。errは数字、errstrには、エラーの内容が入っています。
データベースはプログラムの外部にあるシステムですので、エラー処理は必須です。最初のサンプルでは、エラー処理を行っていませんが必ず、エラー処理を行います。
use DBI; my $dbh = DBI->connect( "DBI:mysql:$database:$hostname", $user, $password ) or die "cannot connect to MySQL: $DBI::errstr";
現在時刻をMySQLの日付時刻型に変換する
現在時刻をMySQLの日付時刻型に変換するにはlocaltime関数とstrftime関数を使用します。
use POSIX 'strftime'; # MySQLの日付時刻型(datetime型) my $current_datetime = strftime("%Y-%m-%d %H:%M:%S", localtime); # MySQLの日付型(date型) my $current_date = strftime("%Y-%m-%d", localtime);
「MySQL::Diff」モジュールで「データベースの定義の差分」を抽出する
MySQLのデータベースの差分から、差分をなくすようなコマンドを自動生成するツールを探していたらMySQL::Diffモジュールを発見した。このモジュールにはmysqldiffというコマンドラインツールがついているので、通常はこちらを使うのが良いみたい。
開発環境と本番環境の差分を埋めるのにとても役立つ。すべての差分を表示してくれるわけではなく、テーブル定義に関する部分だけのようなので、トリガやインデックスについては、自分で設定する必要があるようです。
ドキュメントにはオプションの説明がないようなので、--helpコマンドで確認できる。
mysqldiff --help
DBD::mysqlをインストールするためにはmysql-develが必要
PerlでDBIからMySQLに接続しようと思う場合はDBD::mysqlというモジュールが必要になります。このモジュールは、C言語のライブラリに依存しており、単独ではインストールが失敗します。。たとえばCent OSなどのRed Hat系のOSであればmysql-develというパッケージをインストールしておく必要があります。
yum -y install mysql-devel
「mysql-devel」がインストールされるとDBD::mysqlのインストールは成功するようになります。
cpan DBD::mysql