前回の
O/Rマッパを作る前に
(2)
既存のO/Rマッパとの違いを明確にする
既存のものとまったく同じ問題を解決したところで、
そのためには、
本当に作る必要があるのかを検討する
その問題は新しいO/
CPANモジュールを活用する
CPANのDBIx
ネームスペースやSQLネームスペースには、
ここでは、Aniki
で実際に利用しているCPANモジュールをいくつか紹介します。ただ、
DBIx::Handler──データベースとの接続管理
プロセスがfork
しても、
親プロセスが単に子プロセスを待つだけなど、DBI
のAutoInactiveDestory
属性を利用すれば問題ありません。しかし、fork
した場合のエラー処理や、
そのようなデータベースベースとの接続のハンドリングを担うのがDBIx::Handler
ですDBIx::TransactionManager
とうまく連携し、
ちなみに、DBIx::Handler
とDBIx::TransactionManager
は、DBIx::Skinny
やその後継となったTeng
から切り出されたモジュールです。O/
DBIx::TransactionManager──トランザクションの管理
構造化されたコードから適切にトランザクションを扱うためには、
複雑なアプリケーションでは、
こういった場面でトランザクションのネストができると、
DBIx::TransactionManager
は、
このロールバックの挙動には、AutoCommit
が有効なセッションで後続の処理を実行してしまうと、Try::Tiny
などと組み合わせて例外を捕捉してロールバックし、die
を用いて大域脱出をして、DBIx::Handler
のtxn
メソッドを利用すれば、
SQL::Maker──柔軟なSQL生成
従業員の検索機能をイメージしてみましょう。年齢で絞り込みを行いたい場合もあれば、
このようなケースでは、
今回は、SQL::Maker
を紹介します。SQL::Maker
は、new_
メソッドなどを利用することにより、SELECT
句を表現するオブジェクトを操作してSQLを組み立てることができます。たとえば、$age
が真値の場合は検索クエリにそれを含めるSQLを生成するには、new_
メソッドを使い次のように書けます。
my $select = $maker->new_select;
$select->add_select('*')->add_from('employee');
if ($age) {
$select->add_where(age => $age);
}
my $sql = $select->as_sql;
my @bind = $select->bind;
$dbh->selectall_arrayref($sql, { Slice => {} }, @bind);
文字列結合で同等の処理を実装したコードを想像して比較してみてください。$sql
と@bind
をうまく取り回すのはなかなか骨が折れると思います。これは例なので年齢だけを検索条件にしていますが、
SQL::NamedPlaceholder──名前付きプレースホルダ
巨大なSQLを書く際に、printf
風に順序ベースで値をバインドしていく一般的なプレースホルダを利用すると、
このようなケースでは、SQL::NamedPlaceholder
などの名前付きプレースホルダを利用するのが賢い選択です。名前付きプレースホルダを利用すると、
また、SQL::NamedPlaceholder
をはじめとするPerlの名前付きプレースホルダの実装では、IN
句を利用するときに極めて便利なので、
DBIx::Schema::DSL──DSLによるスキーマ定義
DBIx::Schema::DSL
は、constant
プラグマを用いて一元管理できるなどのメリットがあります。
DBIx::Schema::DSL
をO/DBIx::Schema::DSL
を用いてPerlで記述したスキーマ定義からDDLを生成できるため、
また、DBIx::Schema::DSL
は、SQL::Translator
がバックエンドになっています。SQL::Translator
は、SQL::Translator
はそのしくみ上、SQL::Translator::Schema
です。DBIx::Schema::DSL
ではSQL::Translator::Schema
のオブジェクトを直接生成しています。
SQL::Translator::Schema
はDDL文の変換に使えるほど、Aniki
ではこれを利用して、SQL::Translator::Schema
は頻繁にアクセスされることを想定していないのか、Aniki
ではラッパクラスを定義してホットポイントで独自にキャッシュを行い高速化しています。
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT