drupal でデータベース間の結合を行うことは可能ですか?
2 つのデータベースがあるdrupal
としold_data_source
ます。に参加drupal.node
しold_data_source.page
ます。
db_set_active()
複数のデータベースを使用するために呼び出すことができます。ただし、データベース間のテーブル結合については何も見つかりません!
(移行スクリプトの一部としてこれを調査しており、削除する予定ですold_data_source
)
drupal でデータベース間の結合を行うことは可能ですか?
2 つのデータベースがあるdrupal
としold_data_source
ます。に参加drupal.node
しold_data_source.page
ます。
db_set_active()
複数のデータベースを使用するために呼び出すことができます。ただし、データベース間のテーブル結合については何も見つかりません!
(移行スクリプトの一部としてこれを調査しており、削除する予定ですold_data_source
)
これを行うには、あまり知られていないトリックがあります。これは、テーブルのプレフィックスと呼ばれる機能に依存しています。クエリ内の特定のテーブルに別のデータベースの名前を付けるように settings.php を構成すると、クロスデータベース結合を行うことができます。
これを設定する方法については、 default.settings.phpのコメントにある例を参照してください (Drupal 6 にも同様の構文が適用されます)。元の質問の場合、デフォルトの $databases エントリに次のようなプレフィックス配列があります。
'prefix' => array('page' => 'old_data_source.'),
次に、次のようなクエリを作成します。
db_query("SELECT * FROM {node} n LEFT JOIN {page} p on n.nid=p.nid");
Drupal DB 抽象化レイヤーは {page} を解釈し、次のように SQL に変換します。
SELECT * FROM node n LEFT JOIN old_data_source.page p on n.nid=p.nid;
他に確認すべき唯一のことは、デフォルトの Drupal データベースに関連付けられているデータベース ユーザーが両方のデータベースにアクセスする権限を持っていることです。そうしないと、このトリックは機能しません。
Drupalは、一度に複数のアクティブなデータベースを持つことをサポートしていません。主な理由は、おそらくこれがmysql固有の機能であるためです。
これはphpで実行でき、Drupalデータベースレイヤーをスキップできます。一度実行する必要があるのは移行スクリプト専用なので、コードデータベースを特定するのは問題ありません。私たちだけmysql_ connect
など。おそらく使用を終了することをお勧めしますdb_set_active
前に説明した settings.php トリックでプレフィックスを使用することに加えて、db_query() に渡すクエリ文字列でプレフィックスをハードコーディングすることもできます (質問で行ったことと同様)。
したがって、この場合は次のようになります
drupal.node inner join old_data_source.page on blablabla
d7 でテスト済み。
もちろん、db_set_active 引数で使用しているユーザーは、両方のデータベースにアクセスできる必要があります。