SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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


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

 モデルプログラミングの説明に入る前に、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」のように記述できます。

次のページ
Bookmarkサンプルアプリケーション

この記事は参考になりましたか?

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

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4788 2010/06/21 19:56

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー