Birden çok veritabanı bağlantısını nasıl kurabilirim?


13

Herkes Drupal 8'de birden çok veritabanı bağlantısıyla bağlantı kurmama yardımcı olabilir mi? Aynı sunucuda veritabanı var ve varsayılan Drupal 8 veritabanı ile birlikte erişmek istiyorum.


Veri tabanı bilgilerini settings.php dosyanıza ekleyin ve drupal.org/node/2204083

Merhaba @IvanJaros lütfen soruyu cevapladığı için bunu bir cevap olarak eklemeyi düşünün.
dijital

Yanıtlar:


14

Bu, Drupal 7'deki gibi yapılır, veritabanı kimlik bilgilerini settings.php dosyanıza ekleyebilirsiniz.

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

Artık iki bağlantı seçeneğiniz olacak, varsayılan ve harici. Bunlar arasında geçiş yapabilirsiniz:

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

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

Örneğin, yerelden üretime bu anahtarları nerede yapardınız?
TikaL13

@ TikaL13 Harici kaynaktan veri almak / koymak istediğinizde, getirme / put ile işiniz bittiğinde geri dönersiniz.
googletorp

@googletorp Harici veritabanı kullanılabilir olmadığında, dahili sunucu hatası 500'ü aldım. IDK drupal, bootstrap veya neye bağlanmaya çalışıyor. Nasıl zarif bir şekilde çıkılabilir? Çok teşekkürler
Mudassar Ali

@MudassarAli Gerçekte veritabanını değiştirdiğiniz bir try / catch deyiminde bir şeyler yapabilirsiniz. Bu aşina olduğum bir hata değil, bu yüzden ne olduğundan emin değilim
googletorp

1
Aktif bağlantının değiştirilmesi gerekli değildir. Bunun yerine, Database::getConnection('external')küresel durumla uğraşmaktan kaçının.
Pierre Buyle

5

Kullanarak harici veritabanına bir veritabanı bağlantısı alınırken ek olarak Database::getConnection(), ayrıca kullanabilirsiniz bağımlılık enjeksiyon bağlantısını almak için kodunuzda bir bağımlılık olarak ve bir modülün hizmetleri YAML dosyası içinde bağlantınızı beyan:

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']

Bu güzel bir hile, ama aslında sorguları kendiniz yapmanızı gerektirir. Drupal dahili işlevlerinin yükleme varlıkları ve kayıt varlıkları gibi şeyler yapmasına izin vermeniz gerekiyorsa bu çalışmaz. (Sitelerin paylaşılan içerik türleri varsa Fx)
googletorp

Drupal'ın DB'si Drupal tarafından yönetilir, varlık sistemi içerik tablolarınızın çoğunu yönetir. Veritabanı düzeyinde içerik paylaşmak için Drupal yapılmaz. Bunu yapmak çok kırılgan görünmektedir (yani kontrol edemeyeceğiniz çok fazla şeye bağlıdır). Alfada bile, drupal.org/project/replication gibi bir şey çok daha güvenli görünüyor.
Pierre Buyle

1
Bu mükemmel bir çözüm, ancak en azından
8.3'den

3

çok teşekkür ederim, @googletorp!

İşte biraz daha eksiksiz bir örnek - düğümler oluşturan bir D7 veritabanından kullanıcıları seçmek için kodum:

\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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.