TOP設計・移行・活用> Sledge+O/Rマッパーでデータベースを利用したWebアプリケーション開発




SledgeによるWebアプリケーションフレームワーク入門
SledgeによるWebアプリケーションフレームワーク入門

第5回:データベース
著者:ライブドア  谷口 公一   2005/7/13
前のページ  1  2  3   4  次のページ
Sledge+O/Rマッパーでデータベースを利用したWebアプリケーション開発

   ここまではデータベース周りの最近の動向について触れましたが、Webアプリケーションフレームワーク「Sledge」を利用する際のデータベース操作について、筆者の所属するライブドアで一般的に行なわれている実装方法に沿って見てみましょう。
O/Rマッパーは標準登載されていない…が

   先に「オープンソースのWebアプリケーションフレームワークの多くは、O/Rマッパーが内包されていないケースが多い」と述べましたが、Sledgeにおいても同様にO/Rマッパーはおろか、データベース操作に関してのインターフェースが一切提供されていません。

   しかし、第2回の「セッション管理」の回で「セッションとして保存したい情報をシリアライズして、MySQLのDBに保存するようなしくみを標準的に備えています」と述べました。つまりセッション周りにおいては、データベースへの接続や読み書きが独自に行なわれており、Sledge::Session::DBIというクラスの中でDBIを用いてデータベース操作し、sessionsというテーブルを読み書きするようなしくみが標準的に実装されています。


Sledgeでの実装

   少々遡りますが、第2回の「セッション管理」の回で、Sledgeにおけるセッションの実装例としてnameとemailというパラメータをデータベースに保存する場合のサンプルコードを挙げました。

   よくご覧頂くとわかりますが、post_dispatch_confirm()の中で「$inputの情報を保存」と書かれたコメント行でお茶をにごし、肝心の$inputの情報を保存する手順があえて書かれていません。そこで今回は、この値を実際に保存する方法を取り上げてみたいと思います。

   ライブドアが提供するシステムで主に利用されているO/RマッパーはClass::DBIで、Javaで言うところのHibernateに近い存在なのではないでしょうか。Class::DBIを継承したテーブルごとのクラスをアプリケーション内から呼び出して使用するパターンがほとんどです。

   Sledgeにおいて一番最初にプロジェクトのクラス群を作る際、sledge-setupコマンドを利用しますが、デフォルトでセッションがデータベースによって保存、管理されている以上、このデータベースの情報を保存する設定情報が初期段階に自動的に含まれています。

% sledge-setup ThinkIT
mkdir ThinkIT
mkdir ThinkIT/Config

Initial setup for ThinkIT is now finished.

Remember:

1) Edit ThinkIT/Config/_common.pm
2) Make session table.

  Thanks for using Sledge!
              - Sledge development team

   この時生成されたThinkIT/Config/_common.pm(注)の中の%Cというハッシュに、DATASOURCEというキーを持つ値があり、そこにデータベースへの接続情報が含まれています。この値を適宜書き換えて、セッションを保持するデータベースの情報を設定します。

$C{DATASOURCE} = [ 'dbi:mysql:thinkit;host=dbhost', 'user', 'password' ];

※注: なお、「SLEDGE_CONFIG_NAME」という環境変数を設定しておくことにより、「"ThinkIT::Config::" . $ENV{SLEDGE_CONFIG_NAME}」という名前のモジュールが後から読み込まれ、その値で上書きされます。開発環境とプロダクション環境とでデータソースが異る場合は、このSLEDGE_CONFIG_NAME環境変数を分けて設定することができますので、環境変数をアプリケーションが読み込まれる前の段階で設定しておけば、環境によってデータソースを変えて、同じコードで稼動させることが可能になります。

   このセッションを保持するデータベースの情報を、そのままコンテンツで利用するデータベースの情報としても使用したい場合、ThinkIT/Data/Base.pmというClass::DBIを継承したクラスを作り、そこでこのデータソース情報をセットします。

package ThinkIT::Data::Base;

use strict;
use base qw(Class::DBI);
use ThinkIT::Config;

__PACKAGE__->set_db(Main => ThinkIT::Config->instance->DATASOURCE);

1;
__END__

   このような、データベースの情報を保持したClass::DBIの子クラスを1つ作っておき、それを更に継承して各テーブルに該当するクラスを作ります。なお、これは各テーブルのクラスの親クラスとなりますので、各テーブルで汎用的に利用できるメソッドをこのクラス内にあらかじめ書いておくという使い方もできます。

前のページ  1  2  3   4  次のページ


株式会社ライブドア 谷口 公一
著者プロフィール
株式会社ライブドア  谷口 公一
テクニカルディレクター。専門知識が全く無い中、オープンソースソフトウェアやコミュニティからシステム開発の知識やノウハウを習得し、オープンソースコミュニティにおいて活発に活動を行っている同社に憧れて入社。現在はポータルサイト「livedoor」におけるサービス開発を行う一方、本業の傍ら、お世話になっているオープンソースコミュニティへのコントリビューションも行なっている。


INDEX
第5回:データベース
  Webアプリケーション開発におけるデータベースの位置づけ
  SQLは今や昔?
Sledge+O/Rマッパーでデータベースを利用したWebアプリケーション開発
  データの保存について