여러 데이터베이스 연결을 설정하려면 어떻게해야합니까?


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 외부 소스에서 데이터를 가져 오거나 입력해야 할 때 전환하고 가져 오기 / 입력을 완료하면 다시 전환합니다.
googletorp

@googletorp 외부 데이터베이스를 사용할 수없는 경우 내부 서버 오류 500이 발생했습니다. IDK drupal이 부트 스트랩 또는 무엇을 연결하려고했습니다. 어떻게 우아하게 종료 할 수 있습니까? 감사합니다
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의 DB는 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.