Come posso configurare più connessioni al database?


12

Qualcuno può aiutarmi a configurare la connessione con connessione a più database in Drupal 8? Ho un database sullo stesso server e desidero accedervi insieme al database Drupal 8 predefinito.


Aggiungi le informazioni del database nel tuo file settings.php e puoi passare a database diversi usando drupal.org/node/2204083

Ciao @IvanJaros, ti preghiamo di considerare di aggiungere questo come una risposta poiché risponde alla domanda.
digitale

Risposte:


13

Questo è fatto come in Drupal 7, puoi aggiungere le credenziali del database nel tuo file settings.php.

$databases['default']['default'] = array(
  'database' => 'drupal8',
  'username' => 'username',
  'password' => 'password',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);

$databases['external']['default'] = array(
  'database' => 'external',
  'username' => 'username',
  'password' => 'password',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);

Ora avrai due opzioni di connessione, predefinita ed esterna. Puoi passare da uno all'altro usando:

// Switch to external database
\Drupal\Core\Database\Database::setActiveConnection('external');
// Do queries...

// Switch back
\Drupal\Core\Database\Database::setActiveConnection();

Dove vorresti fare questi interruttori ... dal locale alla produzione, ad esempio.
TikaL13,

@ TikaL13 Passi quando devi recuperare / mettere dati da / a fonte esterna e torni indietro quando hai finito con fetch / put.
googletorp

@googletorp Quando il database esterno non è disponibile, viene visualizzato l'errore 500 del server interno. IDK drupal sta tentando di stabilire una connessione al bootstrap o altro. Come si può smettere con grazia? Grazie mille
Mudassar Ali,

@MudassarAli Potresti essere in grado di fare qualcosa in un'istruzione try / catch in cui cambi il database. Non è un errore che conosco sebbene non sia sicuro di cosa accada
googletorp

1
Non è necessario modificare la connessione attiva. Invece, usa Database::getConnection('external')ed evita di fare casini con lo stato globale.
Pierre Buyle,

5

Oltre a recuperare una connessione al database tramite il database esterno Database::getConnection(), puoi anche usare l' iniezione di dipendenza nel tuo codice per recuperare la connessione come dipendenza e dichiarare la tua connessione nel file YAML dei servizi di un modulo:

database.external:
  class: Drupal\Core\Database\Connection
  factory: 'Drupal\Core\Database\Database::getConnection'
  arguments: ['external']

external_database_dependent_service:
  class: Drupal\MODULE\Some\Class\For\A\ServiceUsingTheExternalDatabase
  arguments: ['@database.external']

Questo è un bel trucco, ma richiede che tu faccia effettivamente le domande da solo. Questo non funzionerà se devi permettere alle funzioni interne di Drupal di fare cose come caricare entità e salvare entità. (Fx se i siti hanno tipi di contenuto condivisi)
googletorp

Il DB di Drupal è gestito dallo stesso Drupal, il sistema di entità gestisce la maggior parte delle tabelle dei contenuti. Drupal non è fatto per condividere il contenuto a livello di database. Farlo sembra molto fragile (cioè dipendo da troppe cose che non puoi controllare). Anche in alpha, qualcosa come drupal.org/project/replication sembra molto più sicuro.
Pierre Buyle,

1
Questa è un'ottima soluzione, ma ho notato che almeno da 8.3 è necessario fornire due parametri alla factory di connessione nell'ordine inverso di quanto mi aspettassi: argomenti: ['default', 'external']
acrosman

2

grazie mille, @googletorp!

ecco un esempio leggermente più completo: il mio codice per selezionare utenti da un database D7 che hanno creato nodi:

\Drupal\Core\Database\Database::setActiveConnection('external');

// Get a connection going
$db = \Drupal\Core\Database\Database::getConnection();

$query = $db->select('users', 'u');
$query->fields('u', array('uid', 'name'));
$query->join('node', 'n', 'n.uid = u.uid');
$query->orderBy('uid');
$users = $query->execute()->fetchAllKeyed();

\Drupal\Core\Database\Database::setActiveConnection();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.