CodeZine(コードジン)

特集ページ一覧

初めてのCatalyst入門(7)
モデルを使ったプログラミング

ブックマークの情報をデータベースに保存する

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/02/04 14:00
目次

データベースアクセスの基本

 モデルプログラミングの説明に入る前に、Perlでデータベースへのアクセスを行うための仕組みについて説明します。

Perlによるデータベースへのアクセス

 Perlからデータベースにアクセスする一般的なやり方では、DBIDBDを使用します。DBIとは、データベースへの操作を抽象化したインターフェースを提供するモジュールで、さまざまなデータベースにアクセスする場合でも、同じようなコードを記述できます。そして接続するデータベースに依存した処理を実装しているのがDBDドライバモジュールになります。DBDには接続するデータベースによってさまざまなモジュールが提供されています。

 主なDBDモジュールには次のものがあり、オープンソースのDBMS以外にも、Oracleなどの商用DBMSに接続するためのドライバも公開されています。

主なDBDモジュール
DBDモジュール 説明
DBD::SQLite SQLite用ドライバ
DBD::Pg PostgreSQL用ドライバ
DBD::mysql MySQL用ドライバ
DBD::Oracle Oracle用ドライバ
DBD::DB2 IBMのDB2用ドライバ
DBD::ODBC ODBC接続用ドライバ

DBIx::Class

 DBI/DBDを使用したプログラムでは直接SQL文を記述することになりますが、オブジェクト指向言語を使用した最近のフレームワークあたりでは、クラスとデータベースのテーブルを結びつけるO/Rマッパ(オブジェクト/リレーショナルマッパ)を利用することが増えています。PerlでもO/Rマッピングを行うためのモジュールとしていくつか公開されていますが、ここではDBIx::Classを紹介します。

 DBIx::ClassではDBIx::Class::Schemaを使用して、Perlのクラスとデータベースのテーブルの関連づけを行いますが、テーブルに対応するクラスは開発者が作成する必要があります。このテーブルに対応するクラスを動的に生成してくれるモジュールとして、DBIx::Class::Schema::Loaderが公開されています。DBIx::Class::Schema::Loaderを使用すれば、あらかじめテーブルに対応するクラスをわざわざ作成しなくても、対象となるデータベースのテーブル構造などを解析して、必要なクラスを動的に作成してくれるようになります。

Catalyst::Model::DBIC::Schema

 Catalystのモデルモジュールとして、前述のDBIx::Class::SchemaDBIx::Class::Schema::Loaderを使用するCatalyst::Model::DBIC::Schemaモジュールが公開されています。

 Catalyst::Model::DBIC::Schemaを使用してモデルを作成するには、ビューなどと同様に「<MyApp>_create.pl」ヘルパスクリプトを使用します。このヘルパスクリプトに渡す最低限必要なパラメータは次のようになります。

[リスト1]Catalyst::Model::DBIC::Schemaを使用してモデルを作成するパラメータ
$ <MyApp>_create.pl model モデル名 DBIC::Schema スキーマクラス名 create=static | dynamic 接続情報

 createにはstaticdynamicを指定できますが、現在、dynamicは非推奨となっています。これらのオプションによる違いは、staticの場合には、ヘルパスクリプト実行時にテーブルに対応するクラスファイルを生成するのに対して、dynamicの場合にはファイルは生成されず、実行時に動的にメモリ上に作成されます。これ以外のオプションについては、Catalyst::Helper::Model::DBIC::Schemaを参照ください。

 MyAppアプリケーションに、MySQLのデータベースに定義されたテーブルをモデルとして作成する例を見てみましょう。この例では、MySQLのデータベース「sampledb」には、UserテーブルとEntryテーブルが定義されているものとします。またsampledbに接続するためのユーザー名とパスワードとして、それぞれ「myusername」と「mypassword」を指定しています。

[リスト2]モデル作成例
$ ./MyApp/script/myapp_create.pl model MyDB DBIC::Schema \
MyApp::Schema create=static \
dbi:mysql:sampledb myusername mypassword

 このコマンドを実行すると、「MyApp/lib/MyApp」フォルダ以下に、次のファイルが作成されます。

作成されるモジュールファイル
作成されるモジュールファイル 説明
Model/MyDB.pm sampledbへの接続情報を持ったモデルクラス
Schema.pm DBIx::Class::Schemaを継承したスキーマクラス
Schema/Result/User.pm Userテーブルに対応するクラス
Schema/Result/Entry.pm Entryテーブルに対応するクラス

 UserテーブルにはINTEGER型の主キー制約がついたidというカラムが定義されているとすると、コントローラからid=1のUser情報を取得するには次のようなコードを記述します。

[リスト3]ユーザ情報を取得する例
sub index :Path :Args(0) {
  my ( $self, $c ) = @_;
  my $user = $c->model('MyDB::User')->find(1);
  $c->response->body($user->name);
}

 「$c->model」メソッドに引数として、”モデル名”::”テーブルに対応するクラス名”を指定すると、テーブルに対する操作を扱うDBIx::Class::ResultSetを返します。このクラスには主キーの値を指定すると、マッチするレコードを表すオブジェクトを返すfindメソッドが定義されているので、こちらを使用して値を取得しています。結果として返されるオブジェクトは、テーブルに対応するクラスのインスタンスとなっており、カラム値にアクセスするためのメソッドがあらかじめ定義されています。よってUserテーブルのnameカラムの値を取得するには「$user->name」のように記述できます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Webアプリケーションフレームワーク「Catalyst」入門

もっと読む

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 花田 善仁(ハナダ ヨシヒト)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5