Bagaimana saya bisa mengatur beberapa koneksi basis data?

12

Adakah yang bisa membantu saya untuk mengatur koneksi dengan beberapa koneksi database di Drupal 8? Saya memiliki database di server yang sama dan saya ingin mengaksesnya bersama dengan database Drupal 8 default.

Mudassar Ali
sumber
Tambahkan informasi database ke file settings.php Anda dan Anda dapat beralih ke database yang berbeda dengan menggunakan drupal.org/node/2204083
Hai @IvanJaros tolong pertimbangkan untuk menambahkan ini sebagai jawaban karena memang menjawab pertanyaan.
digital

Jawaban:

13

Ini dilakukan dengan cara yang sama seperti di Drupal 7, Anda dapat menambahkan kredensial database di file settings.php Anda.

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

Anda sekarang akan memiliki dua opsi koneksi, default dan eksternal. Anda dapat beralih di antara mereka menggunakan:

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

// Switch back
\Drupal\Core\Database\Database::setActiveConnection();
googletorp
sumber
Di mana Anda akan membuat sakelar ini ... dari lokal ke produksi misalnya.
TikaL13
@ TikaL13 Anda beralih ketika Anda harus mengambil / memasukkan data dari / ke sumber eksternal dan Anda beralih kembali ketika Anda selesai dengan pengambilan / put.
googletorp
@googletorp Ketika database eksternal tidak tersedia daripada mendapat kesalahan server internal 500. IDK drupal mencoba membuat koneksi saat bootstrap atau apa. Bagaimana bisa berhenti dengan anggun? Terima kasih banyak
Mudassar Ali
@MudassarAli Anda mungkin dapat melakukan sesuatu dalam pernyataan coba / tangkap di mana Anda benar-benar berpindah basis data. Ini bukan kesalahan yang saya kenal tetapi tidak yakin apa yang terjadi
googletorp
1
Tidak perlu mengubah koneksi aktif. Sebagai gantinya, gunakan Database::getConnection('external')dan hindari bermain-main dengan negara global.
Pierre Buyle
5

Selain mengambil koneksi database ke database eksternal menggunakan Database::getConnection(), Anda juga dapat menggunakan injeksi dependensi dalam kode Anda untuk mengambil koneksi sebagai dependensi dan menyatakan koneksi Anda dalam layanan modul file YAML:

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']
Pierre Buyle
sumber
Ini adalah trik yang bagus, tetapi mengharuskan Anda untuk benar-benar melakukan pertanyaan sendiri. Ini tidak akan berfungsi jika Anda perlu membiarkan fungsi internal Drupal melakukan hal-hal seperti memuat entitas dan menyimpan entitas. (Fx jika situs telah berbagi jenis konten)
googletorp
DB Drupal dikelola oleh Drupal sendiri, sistem entitas mengelola sebagian besar tabel konten Anda. Drupal tidak dibuat untuk berbagi konten di tingkat basis data. Melakukannya tampaknya sangat rapuh (mis. Saya bergantung pada terlalu banyak hal yang tidak dapat Anda kendalikan). Bahkan dalam alpha, sesuatu seperti drupal.org/project/replication tampaknya jauh lebih aman.
Pierre Buyle
1
Ini adalah solusi yang sangat baik, tetapi saya perhatikan bahwa setidaknya pada 8.3 Anda perlu memberikan dua parameter ke pabrik koneksi dalam urutan terbalik dari yang saya harapkan: argumen: ['default', 'external']
acrosman
2

terima kasih banyak, @googletorp!

inilah contoh yang sedikit lebih lengkap - kode saya untuk memilih pengguna dari basis data D7 yang telah membuat simpul:

\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();
lucoweb
sumber