ฉันจะตั้งค่าการเชื่อมต่อฐานข้อมูลหลายรายการได้อย่างไร


12

ทุกคนสามารถช่วยฉันตั้งค่าการเชื่อมต่อด้วยการเชื่อมต่อฐานข้อมูลหลายรายการใน Drupal 8 ได้หรือไม่? ฉันมีฐานข้อมูลบนเซิร์ฟเวอร์เดียวกันและฉันต้องการเข้าถึงพร้อมกับฐานข้อมูลเริ่มต้นของ Drupal 8


เพิ่มข้อมูลฐานข้อมูลลงในไฟล์ settings.php ของคุณและคุณสามารถเปลี่ยนเป็นฐานข้อมูลอื่นได้โดยใช้drupal.org/node/2204083

สวัสดี @IvanJaros โปรดลองเพิ่มคำตอบนี้เพื่อตอบคำถาม
ระบบดิจิตอล

คำตอบ:


13

สิ่งนี้ทำในลักษณะเดียวกับใน Drupal 7 คุณสามารถเพิ่มข้อมูลรับรองฐานข้อมูลในไฟล์ 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',
);

ตอนนี้คุณจะมีสองตัวเลือกการเชื่อมต่อเริ่มต้นและภายนอก คุณสามารถสลับระหว่างพวกเขาโดยใช้:

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

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

คุณจะทำการสวิตช์เหล่านี้ที่ไหน ... จากภายในสู่การผลิตเช่น
TikaL13

@ TikaL13 คุณสลับเมื่อคุณต้องการดึง / ย้ายข้อมูลจาก / ไปยังแหล่งภายนอกและคุณสลับกลับเมื่อคุณใช้ fetch / put
googletorp

@googletorp เมื่อฐานข้อมูลภายนอกไม่สามารถใช้งานได้เกินกว่าข้อผิดพลาดเซิร์ฟเวอร์ภายใน 500 IDK drupal พยายามทำการเชื่อมต่อที่ bootstrap หรืออะไร จะทำให้เลิกได้อย่างสง่างามได้อย่างไร ขอบคุณมาก
Mudassar Ali

@MudassarAli คุณอาจจะสามารถทำบางสิ่งได้ในคำสั่ง try / catch ที่คุณเปลี่ยนฐานข้อมูล ไม่ใช่ข้อผิดพลาดที่ฉันคุ้นเคย แต่ก็ไม่แน่ใจว่าเกิดอะไรขึ้น
googletorp

1
ไม่จำเป็นต้องเปลี่ยนการเชื่อมต่อที่ใช้งานอยู่ ให้ใช้Database::getConnection('external')และหลีกเลี่ยงการยุ่งกับสถานะโลกแทน
Pierre Buyle

5

นอกเหนือจากการดึงการเชื่อมต่อฐานข้อมูลไปยังฐานข้อมูลภายนอกโดยใช้Database::getConnection()คุณยังสามารถใช้การฉีดอ้างอิงในรหัสของคุณเพื่อดึงการเชื่อมต่อเป็นการอ้างอิงและประกาศการเชื่อมต่อของคุณในไฟล์ 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']

นี่เป็นเคล็ดลับที่ดี แต่คุณต้องทำแบบสอบถามเอง สิ่งนี้จะไม่ทำงานหากคุณต้องการให้ฟังก์ชันภายในของ Drupal ทำสิ่งต่าง ๆ เช่นการโหลดเอนทิตีและเอนทิตีการบันทึก (Fx หากไซต์มีประเภทเนื้อหาที่แชร์)
googletorp

ฐานข้อมูลของ Drupal ได้รับการจัดการโดย Drupal เองระบบการจัดการของตารางเนื้อหาส่วนใหญ่ของคุณ Drupal ไม่ได้ทำการแชร์เนื้อหาในระดับฐานข้อมูล การทำเช่นนั้นดูเหมือนจะบอบบางมาก (เช่นฉันขึ้นอยู่กับหลาย ๆ สิ่งที่คุณไม่สามารถควบคุมได้) แม้ในอัลฟาสิ่งที่ดูเหมือนdrupal.org/project/replicationจะปลอดภัยกว่ามาก
Pierre Buyle

1
นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยม แต่ฉันสังเกตเห็นอย่างน้อยที่สุดว่า 8.3 คุณต้องระบุพารามิเตอร์สองตัวให้กับโรงงานเชื่อมต่อในลำดับย้อนกลับมากกว่าที่ฉันคาดไว้: อาร์กิวเมนต์: ['default', 'external']
acrosman

2

ขอบคุณมาก @googletorp!

นี่เป็นตัวอย่างที่สมบูรณ์มากขึ้นเล็กน้อย - รหัสของฉันเพื่อเลือกผู้ใช้จากฐานข้อมูล D7 ที่สร้างโหนด:

\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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.