Drupal 7 でのデータベース操作 - レッスン 1 - Drupal DB API
Drupal 6 用のモジュールを書いたことがあれば、新しい Drupal 7 Database API への移行はそれほど難しくないでしょう。新しい DB API は PHP の PDO 拡張機能に基づいており、MySQL、PostgreSQL、MSSQL、そして場合によっては Oracle など、さまざまなデータベースを扱える能力を備えています。使いやすいかどうかは主観的です――新しい構文に慣れるには時間がかかりますし、SQL クエリを書く方が多くの開発者にとってまだ馴染みがあります。
公式ドキュメントからの短い抜粋を紹介します:
Drupal 7 Database API は、データベースサーバーにアクセスするための標準的で直感的な抽象化レイヤーを提供します。この API は、SQL の構文と力をできるだけ保ちつつ、同時に次のことを実現するよう設計されました:
- 複数のデータベースサーバーを簡単にサポートする;
- 開発者がトランザクションのようなより高度なデータベース機能を実装できるようにする;
- クエリを動的に構築するための構造化されたインターフェースを提供する;
- 組み込みの仕組みを通じてセキュリティとベストプラクティスを確保する;
- モジュールがサイトのクエリを傍受して変更するためのクリーンなインターフェースを提供する;
データベース API のメインドキュメントは、コードのコメントに直接埋め込まれています。ハンドブックは、管理者にやさしい視点からデータベースサーバーと対話したいモジュール開発者向けの入門的なガイダンスで、API ドキュメントを補完します。ハンドブックはすべての API 機能を網羅していない場合があります。
- Database API はオブジェクト指向プログラミングの概念を念頭に構築されているため、OOP に慣れていると役立ちます。ただし、ほとんどの一般的な操作は手続き的なラッパーを介して利用でき、開発者は好みのスタイルを選べます。
Drupal Database API の主な概念
Drupal のデータベース抽象化レイヤー(db レイヤー と呼ばれます)は、PHP PDO ライブラリに基づいています。PDO は、異なるデータベースシステムにアクセスするための統一されたオブジェクト指向 API を提供します。ただし、データベースシステム間の SQL 方言の違いは抽象化しません。
ドライバー
データベースが異なれば必要な対話も異なるため、Drupal の db レイヤーは各データベースタイプに固有のドライバーを必要とします。ドライバーは includes/database/driver ディレクトリにあり、driver はドライバーの一意のキーで――通常は「mysql」「pgsql」のようなデータベースの小文字の名前か、「mycustomdriver」のようなカスタム名です。
各ドライバーには、基底システムクラスを拡張するいくつかのクラスが含まれます。これらのドライバークラスは、データベースを適切にサポートするために必要な任意の動作を上書きできます。ドライバー固有のクラスは、基底クラス名の後にアンダースコアと小文字のドライバー名が続く命名パターンに従います。たとえば、InsertQuery の MySQL 固有バージョンは InsertQuery_mysql です。
データベース接続
接続は DatabaseConnection クラスのインスタンスで、PDO クラスを拡張したものです。Drupal が接続する各データベースには、単一の接続と関連するオブジェクトがあります。接続オブジェクトは、特定のドライバー用のサブクラスである場合があります。
接続オブジェクトには次のようにアクセスできます:
現在アクティブな接続を取得するには:
ほとんどの場合、接続オブジェクトを直接取得する必要はありません。代わりに、それを代行してくれる手続き的なラッパー(db_query() など)を使います。手動で接続を取得する主な理由は、複数のデータベースを扱っていて、アクティブな接続をグローバルに変更するのを避けたい場合です。
アクティブな接続を明示的に設定するには、次を使います:
データベースクエリ
クエリは、接続を介してデータベースに送られる SQL 文です。Drupal の DB API は、静的、動的、Insert、Update、Delete、Merge の 6 種類のクエリをサポートします。一部のクエリは SQL 文字列として書けますが、他はオブジェクト指向のクエリビルダーで扱うのが最適です。「クエリオブジェクト」という用語は、任意のクエリタイプのクエリビルダーを指します。
クエリの作成
クエリオブジェクトは通常 SELECT 操作を介して作成されます。それらは常に DatabaseStatement またはそのサブクラスのインスタンスです。DatabaseStatement は PDOStatement を拡張します。
Drupal はすべてのクエリにプリペアドステートメントを使います。プリペアドステートメントは、実行時に値が挿入されるクエリテンプレートです。SQL 構文をユーザー提供の値から分離し、セキュリティとパフォーマンスを向上させます。プリペアドステートメントは複数のクエリで再利用できます。
Drupal はプリペアドステートメントの仕組みを直接公開しません。代わりに、開発者はプレースホルダー付きの SQL を渡し、クエリオブジェクトを介して実行し、準備と実行は Drupal に内部で処理させます。