Làm thế nào tôi có thể thiết lập nhiều kết nối cơ sở dữ liệu?


11

Ai đó có thể giúp tôi thiết lập kết nối với nhiều kết nối cơ sở dữ liệu trong Drupal 8 không? Tôi có cơ sở dữ liệu trên cùng một máy chủ và tôi muốn truy cập nó cùng với cơ sở dữ liệu Drupal 8 mặc định.


Thêm thông tin cơ sở dữ liệu vào tệp settings.php của bạn và bạn có thể chuyển sang cơ sở dữ liệu khác bằng cách sử dụng drupal.org/node/2204083

Xin chào @IvanJaros vui lòng xem xét thêm câu này dưới dạng câu trả lời vì nó trả lời câu hỏi.
kỹ thuật số

Câu trả lời:


12

Điều này được thực hiện theo cách tương tự như trong Drupal 7, bạn có thể thêm thông tin đăng nhập cơ sở dữ liệu vào tệp settings.php của mình.

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

Bây giờ bạn sẽ có hai tùy chọn kết nối, mặc định và bên ngoài. Bạn có thể chuyển đổi giữa chúng bằng cách sử dụng:

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

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

Bạn sẽ làm những công tắc này ở đâu ... từ địa phương đến sản xuất chẳng hạn.
TikaL13

@ TikaL13 Bạn chuyển đổi khi bạn cần tìm nạp / đặt dữ liệu từ / sang nguồn bên ngoài và bạn chuyển trở lại khi bạn hoàn thành việc tìm nạp / đặt.
googletorp

@googletorp Khi cơ sở dữ liệu bên ngoài không khả dụng hơn lỗi máy chủ nội bộ 500. IDK drupal đang cố gắng tạo kết nối tại bootstrap hoặc gì. Làm thế nào có thể làm cho bỏ duyên dáng? Cảm ơn rất nhiều
Mudassar Ali

@MudassarAli Bạn có thể làm điều gì đó trong câu lệnh try / Catch trong đó bạn thực sự chuyển đổi cơ sở dữ liệu. Đó không phải là một lỗi mà tôi quen thuộc mặc dù vậy không chắc điều gì xảy ra
googletorp

Thay đổi kết nối hoạt động là không cần thiết. Thay vào đó, sử dụng Database::getConnection('external')và tránh gây rối với nhà nước toàn cầu.
Pierre Buyle

5

Ngoài việc truy xuất kết nối cơ sở dữ liệu đến cơ sở dữ liệu bên ngoài bằng cách sử dụng Database::getConnection(), bạn cũng có thể sử dụng phép nội xạ phụ thuộc trong mã của mình để truy xuất kết nối dưới dạng phụ thuộc và khai báo kết nối của bạn trong tệp dịch vụ YAML của mô-đun:

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

Đây là một mẹo hay, nhưng đòi hỏi bạn phải tự mình thực hiện các truy vấn. Điều này sẽ không hoạt động nếu bạn cần để các chức năng nội bộ của Drupal thực hiện các công việc như tải các thực thể và lưu các thực thể. (Fx nếu các trang web có các loại nội dung được chia sẻ)
googletorp

DB của Drupal được quản lý bởi chính Drupal, hệ thống thực thể quản lý hầu hết các bảng nội dung của bạn. Drupal không được thực hiện để chia sẻ nội dung ở cấp cơ sở dữ liệu. Làm như vậy có vẻ rất mong manh (ví dụ: tôi phụ thuộc vào quá nhiều thứ bạn không thể kiểm soát). Ngay cả trong bản alpha, một cái gì đó như drupal.org/project/replication có vẻ an toàn hơn nhiều.
Pierre Buyle

1
Đây là một giải pháp tuyệt vời, nhưng tôi nhận thấy rằng ít nhất là vào ngày 8.3 bạn cần cung cấp hai tham số cho nhà máy kết nối theo thứ tự ngược lại so với tôi dự kiến: đối số: ['mặc định', 'bên ngoài']
acrosman

2

cảm ơn bạn rất nhiều, @googletorp!

đây là một ví dụ đầy đủ hơn một chút - mã của tôi để chọn người dùng từ cơ sở dữ liệu D7 đã tạo các nút:

\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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.