1

drupal でデータベース間の結合を行うことは可能ですか?

2 つのデータベースがあるdrupalとしold_data_sourceます。に参加drupal.nodeold_data_source.pageます。

db_set_active()複数のデータベースを使用するために呼び出すことができます。ただし、データベース間のテーブル結合については何も見つかりません!

(移行スクリプトの一部としてこれを調査しており、削除する予定ですold_data_source)

4

4 に答える 4

5

これを行うには、あまり知られていないトリックがあります。これは、テーブルのプレフィックスと呼ばれる機能に依存しています。クエリ内の特定のテーブルに別のデータベースの名前を付けるように 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 データベースに関連付けられているデータベース ユーザーが両方のデータベースにアクセスする権限を持っていることです。そうしないと、このトリックは機能しません。

于 2012-03-19T15:18:49.797 に答える
1

Drupalは、一度に複数のアクティブなデータベースを持つことをサポートしていません。主な理由は、おそらくこれがmysql固有の機能であるためです。

これはphpで実行でき、Drupalデータベースレイヤーをスキップできます。一度実行する必要があるのは移行スクリプト専用なので、コードデータベースを特定するのは問題ありません。私たちだけmysql_ connectなど。おそらく使用を終了することをお勧めしますdb_set_active

于 2010-08-05T12:05:15.683 に答える
1

前に説明した settings.php トリックでプレフィックスを使用することに加えて、db_query() に渡すクエリ文字列でプレフィックスをハードコーディングすることもできます (質問で行ったことと同様)。

したがって、この場合は次のようになります

drupal.node inner join old_data_source.page on blablabla

d7 でテスト済み。

もちろん、db_set_active 引数で使用しているユーザーは、両方のデータベースにアクセスできる必要があります。

于 2012-03-19T15:35:31.787 に答える