So definieren und verwenden Sie eine externe Datenbankverbindung in einem benutzerdefinierten Modul

10

Ich entwickle ein Modul, das stark von externen Datenbankabfragen abhängt. Gibt es eine bewährte Methode zum Definieren und Verwenden einer externen Datenbankverbindung in einem Modul?

Auf dieser Seite erfahren Sie, wie Sie die Verbindung herstellen, aber nicht, wo Sie sie in ein Modul einfügen sollen (bestimmter Hook?), Sodass ich sie nur einmal definieren muss. Außerdem muss immer "db_set_active ('YourDatabaseKey')" ausgeführt werden. oder kann ich ein Argument übergeben, mit dem die Datenbank verwendet wird? Ich benutze Drupal 7.

Whiskey
quelle
Wenn Sie verschiedene Arten von Datenbanken verwenden, benötigen Sie das DBTNG- Modul
Sivaji,
Vielen Dank für den Vorschlag, aber dieses Modul ist nur erforderlich, wenn Sie Drupal 6 verwenden. Ich verwende Drupal 7.
Whisky

Antworten:

10

Es gibt keinen bestimmten Ort, an dem dieser Code abgelegt werden kann (Hook oder Modul). Sie platzieren ihn einfach dort, wo Sie ihn benötigen.
Es sollte also kurz vor Ihren Abfragen in der anderen Datenbank und kurz danach erfolgen, um die Standard-DB zurückzusetzen.

Wenn Ihr gesamtes Modul auf der externen Datenbank basiert, setzen Sie es einfach an den Anfang der ersten Funktion, die für Ihr Modul aufgerufen wird, und an das Ende der letzten Funktion.

Natürlich sollte jede Ihrer Funktionen in der externen Datenbank ausgeführt werden und nichts muss die Standarddatenbank abfragen müssen, ohne zurückzuschalten.

Dieser folgende Code würde fehlschlagen:

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(); 

Sie sollten hin und her wechseln:

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(); 
tostinni
quelle
2
Danke für die Erklärung. Am Ende habe ich eine separate Funktion erstellt, die meine externe Datenbank mit db_set_active auswählt. Wenn dies fehlschlägt, wird die Datenbankkonfiguration hinzugefügt und es erneut versucht. Auf diese Weise kann ich es in den verschiedenen Hooks verwenden, bevor externe Abfragen ausgeführt werden, aber ich muss die Standardeinstellung erneut aktivieren, wie Sie bereits betont haben.
Whisky
4

Sie müssen in hinzufügen settings.phpan mich /sites/default/in folgenden Syntax

// 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' => '',
    ),
  ),
);

Nach diesen Einstellungen können Sie mit db_set_active () zwischen Datenbanken wechseln.

Shoaib Nawaz
quelle
Vielen Dank, Sie können dies auf diese Weise tun, aber ich habe mich dafür entschieden, dies innerhalb meines Moduls zu tun, wie auf der Seite beschrieben, auf die ich in der Frage verlinkt habe. Auf diese Weise können Administratorbenutzer ihre eigene Konfiguration in ein Administratoreinstellungsformular eingeben.
Whisky