[pod] [xml]

名前

DBD::mysql - Perl5 データベース・インターフェース(DBI)のためのMySQLドライバ

概要

    use DBI;
    $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
    $dbh = DBI->connect($dsn, $user, $password);
    $drh = DBI->install_driver("mysql");
    @databases = DBI->data_sources("mysql");
       または
    @databases = DBI->data_sources("mysql",
                                   {"host" => $host, "port" => $port});
    $sth = $dbh->prepare("SELECT * FROM foo WHERE bla");
       または
    $sth = $dbh->prepare("LISTFIELDS $table");
       または
    $sth = $dbh->prepare("LISTINDEX $table $index");
    $sth->execute;
    $numRows = $sth->rows;
    $numFields = $sth->{'NUM_OF_FIELDS'};
    $sth->finish;
    $rc = $drh->func('createdb', $database, $host, $user, $password, 'admin');
    $rc = $drh->func('dropdb', $database, $host, $user, $password, 'admin');
    $rc = $drh->func('shutdown', $host, $user, $password, 'admin');
    $rc = $drh->func('reload', $host, $user, $password, 'admin');
    $rc = $dbh->func('createdb', $database, 'admin');
    $rc = $dbh->func('dropdb', $database, 'admin');
    $rc = $dbh->func('shutdown', 'admin');
    $rc = $dbh->func('reload', 'admin');

  #!/usr/bin/perl
  use strict;
  use DBI();
  # データベースへの接続
  my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost",
                         "joe", "joe's password",
                         {'RaiseError' => 1});
  # テーブル'foo'をドロップ。'foo'が存在していないと、これは失敗するでしょう。
  # そのため周りをevalで囲んでいます。
  eval { $dbh->do("DROP TABLE foo") };
  print "Dropping foo failed: $@\n" if $@;
  # 新しいテーブル'foo'を作成します。これは失敗するはずがありません。
  # そのためエラーをキャッチしていません。
  $dbh->do("CREATE TABLE foo (id INTEGER, name VARCHAR(20))");
  # 'foo'にデータをINSERTします。nameをクォートするために
  # $dbh->quote()を使っています。
  $dbh->do("INSERT INTO foo VALUES (1, " . $dbh->quote("Tim") . ")");
  # 同じこと。ただしプレースホルダを使っています。
  $dbh->do("INSERT INTO foo VALUES (?, ?)", undef, 2, "Jochen");
  # 今度はテーブルからのデータを取り出します
  my $sth = $dbh->prepare("SELECT * FROM foo");
  $sth->execute();
  while (my $ref = $sth->fetchrow_hashref()) {
    print "Found a row: id = $ref->{'id'}, name = $ref->{'name'}\n";
  }
  $sth->finish();
  # データベースからの切断
  $dbh->disconnect();

説明

DBD::mysqlはMySQLデータベースのためのPerl5データベース・インターフェース・ ドライバです。言い換えると:DBD::mysqlはPerlプログラミング言語と MySQLリレーショナル・データベース管理システムに入っている MySQLプログラミングAPIとのインターフェースです。このプログラミングAPIで 提供されているほとんどの機能がサポートされています。あまり使われない いくつかの機能がなくなっています。これは主にだれも それを要求したことがなかったからです :-)

これが最も必要とされることですから、最初にDBD::mysqlの使い方について 説明します。インストールについては、以下のセクション インストールWIN32でのインストール既知のバグをご覧下さい。 簡単な例に付いては、上記のをご覧下さい。

Perlからは、以下のステートメントでインタフェースを有効にします:

    use DBI;

この後、複数のMySQLデータベース・サーバに接続し、簡単な オブジェクト指向インターフェースを介してそれらのデータベースへ 複数の問い合わせを送信することが出来ます。データベース・ハンドルと ステートメント・ハンドルという2つのタイプのオブジェクトが利用可能です。 Perl は以下のようなconnectメソッドでデータベース・ハンドルを返します:

  $dbh = DBI->connect("DBI:mysql:database=$db;host=$host",
                      $user, $password, {RaiseError => 1});

一度データベースにつながると、以下のようにしてSQLステートメントを 実行することが出来ます:

  my $query = sprintf("INSERT INTO foo VALUES (%d, %s)",
                      $number, $dbh->quote("name"));
  $dbh->do($query);

quoteとdoメソッドについての詳細はDBI(3)をご覧下さい。 他の方法として以下のものがあります:

  $dbh->do("INSERT INTO foo VALUES (?, ?)", undef,
           $number, $name);

この場合、quoteメソッドは自動的に行われます。DBI(3)でbind_paramメソッドも ご覧下さい。詳細に付いては以下のデータベース・ハンドルをご覧下さい。

結果を取り出したければ、以下のようにしてステートメント・ハンドルと 呼ばれるものを作成する必要があります:

  $sth = $dbh->prepare("SELECT * FROM $table");
  $sth->execute();

このステートメント・ハンドルはいくつかの目的のために使うことができます。 何よりもまずデータの行を取り出せます:

  my $row = $sth->fetchow_hashref();

テーブルにIDとNAMEというカラムがあれば、$row はキーとしてIDとNAMEを 持つハッシュへのリファレンスとなります。詳細に付いては、 以下のステートメント・ハンドルをご覧下さい。

それでは、よりフォーマルなアプローチをしてきましょう:

クラス・メソッド

プライベートなメタデータ・メソッド

サーバ管理

データベース・ハンドル

DBD::mysqlドライバは以下のドライバ・ハンドルの属性をサポートして います(読込のみ)。

  $errno = $dbh->{'mysql_errno'};
  $error = $dbh->{'mysql_error};
  $info = $dbh->{'mysql_hostinfo'};
  $info = $dbh->{'mysql_info'};
  $insertid = $dbh->{'mysql_insertid'};
  $info = $dbh->{'mysql_protoinfo'};
  $info = $dbh->{'mysql_serverinfo'};
  $info = $dbh->{'mysql_stat'};
  $threadId = $dbh->{'mysql_thread_id'};

これらはそれぞれ、mysql_errno(), mysql_error(), mysql_get_host_info(), mysql_info(), mysql_insert_id(), mysql_get_proto_info(), mysql_get_server_info(), mysql_stat() and mysql_thread_id()に対応します。

ステートメント・ハンドル

DBD::mysqlのステートメント・ハンドルは多くの属性をサポートしています。 これらには以下の例のようにアクセスします、

  my $numFields = $sth->{'NUM_OF_FIELDS'};

ほとんどの属性はexecuteが成功した後でないと適性ではないことに 注意してください。そのような場合には、undefが返されます。 もっとも重要な例外はmysql_use_result属性です:これはドライバに mysql_store_resultではなく、mysql_use_resultを強制的に 使うようにします。mysql_use_resultはより速く、メモリ消費もより少ないのですが、 他のプロセスを妨害しがちです(これはmysql_store_resultがデフォルトである理由です)

mysql_use_result属性を設定することは、以下のように使います:

  my $sth = $dbh->prepare("QUERY", { "mysql_use_result" => 1});

または

  my $sth = $dbh->prepare("QUERY");
  $sth->{"mysql_use_result"} = 1;

カラムに依存する属性、例えばNAME、カラム名は配列へのリファレンス として返されます。この配列インデックスはfetchrowまたは同類のメソッド によって返される配列でのインデックスに対応します。例えば以下のコードは テーブル名のヘッダを全ての行と一緒に出力します:

  my $sth = $dbh->prepare("SELECT * FROM $table");
  if (!$sth) {
      die "Error:" . $dbh->errstr . "\n";
  }
  if (!$sth->execute) {
      die "Error:" . $sth->errstr . "\n";
  }
  my $names = $sth->{'NAME'};
  my $numFields = $sth->{'NUM_OF_FIELDS'};
  for (my $i = 0;  $i < $numFields;  $i++) {
      printf("%s%s", $i ? "," : "", $$names[$i]);
  }
  print "\n";
  while (my $ref = $sth->fetchrow_arrayref) {
      for (my $i = 0;  $i < $numFields;  $i++) {
          printf("%s%s", $i ? "," : "", $$ref[$i]);
      }
      print "\n";
  }

移植可能なアプリケーションでは、頭だけを大文字にしたり、大文字小文字を 混った名前の属性を使うように制限すべきです。名前が小文字の属性はDBD::mysqlで 提供されています。属性には以下のものが含まれます:

トランザクションのサポート

DBD::mysql 2.0416からは、トランザクションがサポートされます。 トランザクションのサポートは以下のように機能します:

上記のことから、以下のことに注意しなければなりません:

SQL拡張

C APIレベルで使うことが出来るMySQLのあるメタデータ関数は、ここでは 実装されていません。代りに、それらは"SQL拡張(=SQL extesions)"として 実装されています。それらが返すのは実際にはステートメント・ハンドルと 全く同じものだからです。以下のものがあります:

互換性の警告

ステートメント属性TYPEは、その意味はDBD::mysql 2.0119とは 変更されています。以前、それはネイティブなエンジンのカラム型の 配列でしたが、今は移植可能なSQLカラム型の配列です。古い属性はまだ mysql_typeで使うことが出来ます

DBD::mysqlはいくつかの理由から目標を変更しました:

これは多くのことが、過去も現在も変更するべきだということを意味します。 あまり意味のない互換性を維持することには興味がありません、それは本当に 有効になることなく、ドライバのコードを増大させます、私はこれまでも、 そしてこれからもいくつかの機能や属性を削っていくつもりです。

円滑なアップグレードを保証するために、以下の方針を採っています:

例えば: ステートメント・ハンドル属性

    $sth->{'LENGTH'}

はDBD::mysql 2.00xyで廃棄準備だと宣言されたとします。これは DBD::mysql 2.02xyで廃棄前となり、2.04xyで削除されます。

廃棄準備の機能(= Obsolete Features)

廃棄前の機能(=Deprecated Features)

過去の機能(=Historic Features)

MULTITHREADING

DBD::mysqlのマルチスレッドの能力は完全に基礎となっているCライブラリに 依存します。モジュールはハンドル・データとだけ一緒に機能します。 グローバル変数は何もアクセスされませんし、また(私の知りうる限りでは) 安全でない関数は呼ばれていません。こうしてCライブラリがスレッドセーフで、 スレッド間でハンドルを共有しなければ、DBD::mysql は完全にスレッド・セーフです。

明白な疑問:「Cライブラリはスレッド・セーフですか?」です。 MySQLは"ほとんど"で、理論的には、もしCライブラリが、構成のために -with-thread-safe-clientを渡すことによってスレッド・セーフになるように コンパイルされていれば(デフォルトではそうなっていません)、 "Yes"ということができるでしょう。マニュアルの スレッド・セーフなクライアントの作り方(How to make a threadsafe client)と いうセクションをご覧下さい。

インストール

Windowsユーザはこのセクションを飛ばして、以下のWIN32インストールに いってください。他の方は読みつづけてください。

まず最初に、DBD::mysqlをインストールするためにMySQLサーバーをインストール する必要はなりません。しかしながらソースからDBD::mysqlをコンパイルする のであれば、少なくともクライアント・ライブラリと、おそらくはヘッダ・ファイルが 必要になります。MySQLの場合、構成オプション --without-serverを使うことにより クライアントだけのバージョンを作成することができます。 コンパイル済みのバイナリを使う場合には、ディストリビューションにあわせて、 MySQL-clientとMySQL-develなどのようなにRPMを選択するだけで使うことが出来る でしょう。

最初にDBIモジュールをインストールする必要があります。簡単なDBIシェルdbimonを 使うために、もう1つのPerlモジュールData::ShowTableをインストールすることを お勧めします。

CPANモジュールを介して自動的なインストールを試してみることをお勧めします。 以下のようにやってみてください:

  perl -MCPAN -e shell

CPANモジュールを使うのが始めてであれば、たくさんの質問をたずねるでしょう。 最後にCPANプロンプトが出たら、以下のように入力してください:

  install Bundle::DBD::mysql

これが失敗したら(これについては場合によって、例えばファイア・ウォールの中に いたり、ネットワーク・アクセスを持っていないなどいくつのも理由があります)、 手動インストールをする必要があります。まず最初に以下のようなCPANミラーから アーカイブを取ってくる必要があります:

  ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module

以下のアーカイブが必要です(バージョン番号は変更されているかもしれません、 私はこれを書いている時点での現行のものを選んでいます):

  DBI/DBI-1.15.tar.gz
  Data/Data-ShowTable-3.3.tar.gz
  DBD/DBD-mysql-2.1001.tar.gz

そして以下のコマンドを入力します:

  gzip -cd DBI-1.15.tar.gz | tar xf -
  cd DBI-1.15
  perl Makefile.PL
  make
  make test
  make install
  cd ..
  gzip -cd Data-ShowTable-3.3.tar.gz | tar xf -
  cd Data-ShowTable-3.3
  perl Makefile.PL
  make
  make install  # 一連のテストが壊れているのでmake testはしないでください
  cd ..
  gzip -cd DBD-mysql-2.1001.tar.gz | tar xf -
  cd DBD-mysql-2.1001
  perl Makefile.PL
  make
  make test
  make install

"perl Makefile.PL"の間に、いくつかの質問されます。 また別の質問は質問はヘッダファイルとライブラリが入っているディレクトリです。 例えばファイルmysql.hが/usr/include/mysql/mysql.hにあるならば、 ヘッダ・ディレクトリに/userを入力してください。 /usr/lib/mysql/libmysqlclient.a あるいは /usr/lib/libmysqlclient.soでも 同様です。

WIN32 INSTALLATION

ActivePerlを使っているのであれば、DBD-mysqlをインストールするために ppmを使うことが出来ます。Perl 5.6ではBuild 623以上にアップグレードして ください。すると以下のコマンドが実行できるようになります

  ppm install DBI
  ppm install DBD::mysql

HTTPプロキシーが必要であれば、環境変数http_proxyを設定する 必要があるかもしれません。例えば以下のように:

  set http_proxy=http://myproxy.com:8080/

これを書いている辞典ではActivePerl 5.8.0リボジトリにはDBD::mysqlは ありません。しかしRandy Kobesが親切にも独自の配布をしてくれています。 それは以下のようにするとうまくいくでしょう:

  ppm install http://theoryx5.uwinnipeg.ca/ppms/DBD-mysql.ppd

そうでなければ、まちがいなくCコンパイラが必要になります。そしてそれは Perlそのものをコンパイルするために使われたのもと同じでなければいけません。 もしCコンパイラをお持ちでなければ、Perlソース・ディトリビューションからの ファイルREADME win32がegcsやgccのようなフリーで手に入る配布可能なCコンパイラを 教えてくれます。PerlソースはCPANミラーのどこでも、srcディレクトリで利用可能です。 例えば以下の場所があります。

    ftp://ftp.funet.fi/pub/languages/perl/CPAN/src/latest.tar.gz

Win32環境でDBD::mysqlをインストールするためには、www.tcx.seでダウンロードできる win32 clientsパッケージを使うことをお勧めします。私の場合、以下のステップが 必要になりました:

ActiveState PerlバージョンのためのPPMパッケージを作成したければ、 上記のステップを以下のように変更します:以下のように実行します。

  perl Makefile.PL NAME=DBD-mysql BINARY_LOCATION=DBD-mysql.tar.gz
  nmake ppd
  nmake

一度それが終了したら、tarとgzip(例えばCygWin32ディストリビューションのもの)を 使ってアーカイブを作成します:

  mkdir x86
  tar cf x86/DBD-mysql.tar blib
  gzip x86/DBD-mysql.tar

x86/DBD-mysql.tar.gz と DBD-mysql.ppd というファイルをあるWWWサーバにおいて、 以下のようにPPMプログラムでタイプすることにより、インストールします。

  install http://your.server.name/your/directory/DBD-mysql.ppd

作者(=AUTHORS)

The current version of DBD::mysql is almost completely written by Jochen Wiedmann (joe@ispsoft.de). The first version's author was Alligator Descartes(descarte@symbolstone.org), who has been aided and abetted by Gary Shea, Andreas Kvnig and Tim Bunce amongst others.

The Mysql module was originally written by Andreas Kvnig <koenig@kulturbox.de>. The current version, mainly an emulation layer, is from Jochen Wiedmann.

著作権(=COPYRIGHT)

This module is Copyright (c) 1997-2001 Jochen Wiedmann, with code portions Copyright (c)1994-1997 their original authors. This module is released under the same license as Perl itself. See the Perl README for details.

メーリング・リスト・サポート

このモジュールは以下のメーリング・リストで管理され、サポートされています。

    msql-mysql-modules@lists.mysql.com

このリストに参加するには以下のアドレスにメールします:

    msql-mysql-modules-subscribe@lists.mysql.com

あるいは

    msql-mysql-modules-digest-subscribe@lists.mysql.com

メーリング・リストのアーカイブは以下のアドレスから利用できます:

    http://www.progressive-comp.com/Lists/?l=msql-mysql-modules

さらにDBIとそのモジュール一般についての質問はdbi-userメーリングリストを 試してもよいかもしれません。以下のサイトから参加できます:

    http://www.fugue.com/dbi

メーリング・リストのアーカイブは以下のサイトにあります:

     http://www.rosat.mpe-garching.mpg.de/mailing-lists/PerlDB-Interest/
     http://outside.organic.com/mail-archives/dbi-users/
     http://www.coe.missouri.edu/~faq/lists/dbi.html

DBIについてのさらなる情報

DBIプロジェクトについてのさらなる情報は以下のURLのWWWで見つかるでしょう:

    http://www.symbolstone.org/technology/perl/DBI

ここにはドキュメント、メーリングリストへのリンク、メーリングリストのアーカイブ、 そして利用可能なモジュールの最新バージョンへのリンクがあります。

DBIインターフェースそのものの情報は以下のようにタイプするととることが出来ます:

    perldoc DBI

さあ、やってみましょう!