カスタムモジュールで外部データベース接続を定義して使用する方法


10

外部データベースクエリに大きく依存するモジュールを開発しています。モジュール全体で外部データベース接続を定義して使用するためのベストプラクティスはありますか?

このページでは、接続を確立する方法を示していますが、モジュール(特定のフック?)のどこに接続するかは示していないため、一度定義するだけで済みます。また、常に「db_set_active( 'YourDatabaseKey');」を実行する必要がありますか?または、使用するdbを設定する引数を渡すことはできますか?私はDrupal 7を使用しています。


さまざまなタイプのデータベースを使用している場合は、DBTNGモジュールが必要になります
Sivaji

提案に感謝しますが、そのモジュールはDrupal 6を使用している場合にのみ必要です。私はDrupal 7を使用しています
Whiskey

回答:


10

このコード(フックまたはモジュール)を配置する特定の場所はありません。必要な場所に配置するだけです。
そのため、他のデータベースでのクエリの直前と、デフォルトのDBに戻す直後に行く必要があります。

すべてのモジュールが外部DBに依存する場合は、モジュールに対して呼び出された最初の関数の最初と最後の関数の最後に配置します。

もちろん、関数はすべて外部DBで実行する必要があり、スイッチバックせずにデフォルトのデータベースをクエリする必要はありません。

次のコードは失敗します:

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

$node = node_load(123); //This would fail on the external DB.

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 

前後に切り替える必要があります。

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 
$node = node_load(123); //Query made on the default Drupal DB.
db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 

2
説明ありがとう。結局、db_set_activeを使用して外部データベースを選択する別の関数を作成し、それが失敗した場合は、db構成を追加して再試行します。そうすれば、外部クエリを実行する前に別のフックでそれを使用できますが、指摘したように、デフォルトを再びアクティブに設定する必要があります。
ウイスキー、

4

次の構文にsettings.phpあるに追加する必要があり/sites/default/ます

// Drupal 6

$db_url['default'] = 'mysql://db_user:password@localhost/db_name';
$db_url['external'] = 'mysql://db_user2:password@localhost/db_name2';

// Drupal 7

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'db1',
      'username' => 'user1',
      'password' => 'pass',
      'host' => 'host1',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
  'extra' =>
  array (
    'default' =>
    array (
      'database' => 'db2',
      'username' => 'user2',
      'password' => 'pass',
      'host' => 'host2',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

これらの設定の後、db_set_active()を使用してデータベースを切り替えることができます。


おかげで、あなたはこの方法でそれを行うことができますが、私は質問でリンクしたページで説明されているように、私のモジュール内からそれを行うことを選びました。そうすることで、管理者ユーザーに管理者設定フォームで独自の構成を入力させることができます。
ウイスキー、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.