Drupal でのクロスデータベーステーブル結合?
-
26-09-2019 - |
質問
Drupalでクロスデータベース結合を行うことは可能ですか?
2 つのデータベースがあるとします。 drupal
そして old_data_source
. 。参加したい drupal.node
に old_data_source.page
.
db_set_active()
を呼び出して複数のデータベースを使用できます。ただし、データベース間のテーブル結合に関するものは何も見つかりません。
(移行スクリプトの一部としてこれを調査しており、削除する予定です) old_data_source
)
解決
Drupalは、一度に複数のアクティブ・データベースを有するサポートされていません。主な理由は、これは、MySQL固有の機能であることはおそらくあります。
あなたは、PHPでこれを行うと、Drupalのデータベース層を省略することができます。それは一度だけ実行する必要があり、移行スクリプトのためですので、コードデータベースの特定を行うために大丈夫です。ちょうど私達mysql_ connect
などは、おそらくdb_set_active
他のヒント
これを実現するためのあまり知られていないトリックがあります。これは、テーブル プレフィックスと呼ばれる機能に依存します。クエリ内の特定のテーブルに別のデータベースの名前をプレフィックスとして付けるように settings.php を設定すると、データベース間の結合を行うことができます。
コメントの例を見てください。 デフォルト.設定.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 データベースに関連付けられたデータベース ユーザーが両方のデータベースにアクセスする権限を持っていることです。そうしないと、このトリックは機能しません。
私は最近、この問題を自分自身に直面しているため、この答えに追加するにはちょうどたいと思います。遠く離れて(私の場合)によって、最も簡単な解決策は、MySQL ビューのことを作成することでした舞台裏で参加しました。排除クロスデータベースの必要性がdrupalの自身の中に参加していること。
私の前に述べたのsettings.phpトリックで接頭辞を使用することに加えて、あなたはまた、あなたが(あなたがあなたの質問に何をしたかに類似)db_query()に渡すことをクエリ文字列に接頭辞をハードコードすることができます。
だから、この場合には、あなたが持っていると思います。
drupal.node inner join old_data_source.page on blablabla
D7でテストます。
もちろん、あなたがdb_set_active引数に使用しているユーザーは、両方のデータベースへのアクセス権を持っている必要があります。