質問

Drupalでクロスデータベース結合を行うことは可能ですか?

2 つのデータベースがあるとします。 drupal そして old_data_source. 。参加したい drupal.nodeold_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引数に使用しているユーザーは、両方のデータベースへのアクセス権を持っている必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top