Jak zdefiniować i używać zewnętrznego połączenia z bazą danych w module niestandardowym

10

Tworzę moduł, który będzie w dużej mierze opierał się na zapytaniach do zewnętrznych baz danych. Czy istnieje najlepsza praktyka definiowania i korzystania z zewnętrznego połączenia z bazą danych w całym module?

Ta strona mówi mi, jak nawiązać połączenie, ale nie wiem, gdzie umieścić go w module (konkretny haczyk?), Więc muszę to zdefiniować tylko raz. Czy zawsze konieczne jest wykonanie polecenia „db_set_active ('YourDatabaseKey');” lub czy mogę przekazać argument, który ustawi db do użycia? Używam Drupala 7.

Whisky
źródło
Jeśli korzystasz z różnych typów baz danych, potrzebujesz modułu DBTNG
Sivaji,
Dzięki za propozycję, ale że moduł jest konieczne tylko w przypadku korzystania Drupal 6. Używam Drupal 7.
Whisky

Odpowiedzi:

10

Nie ma konkretnego miejsca na umieszczenie tego kodu (haka lub modułu), wystarczy umieścić go tam, gdzie jest potrzebny.
Powinien więc przejść tuż przed twoimi zapytaniami do innej bazy danych i zaraz po tym, aby przywrócić domyślną bazę danych.

Jeśli cały twój moduł będzie polegał na zewnętrznej bazie danych, po prostu umieść go na początku pierwszej funkcji wywoływanej dla twojego modułu i na końcu ostatniej funkcji.

Oczywiście każda twoja funkcja powinna być wykonywana na zewnętrznej bazie danych i nic nie musi przesyłać zapytania do domyślnej bazy danych bez przełączania się z powrotem.

Następujący kod nie powiedzie się:

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

Powinieneś przełączać się tam iz powrotem:

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
źródło
2
Dziękuję za wyjaśnienie. Skończyło się tworzenie oddzielnej funkcji, która wybiera moją zewnętrzną bazę danych za pomocą db_set_active, a jeśli to się nie powiedzie, dodaje konfigurację bazy danych i próbuje ponownie. W ten sposób mogę używać go w różnych zaczepach przed uruchomieniem zewnętrznych zapytań, ale muszę ponownie ustawić domyślną aktywność, jak wskazałeś.
Whisky,
4

Trzeba będzie dodać do settings.phpznajdującego się /sites/default/w następującej składni

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

Po tych ustawieniach możesz użyć db_set_active (), aby przełączać się między bazami danych.

Shoaib Nawaz
źródło
Dzięki, możesz to zrobić w ten sposób, ale zdecydowałem się to zrobić w moim module, jak opisano na stronie, do której odsyłam w pytaniu. W ten sposób użytkownicy administratorzy mogą wypełnić własną konfigurację w formularzu ustawień administratora.
Whisky,