2010-08-05 3 views
0

drupal에서 데이터베이스 간 조인을 수행 할 수 있습니까?Drupal에서 교차 데이터베이스 테이블 조인?

두 데이터베이스가 있다고 가정하면 drupalold_data_source입니다. drupal.nodeold_data_source.page에 가입하고 싶습니다.

db_set_active()을 호출하여 여러 데이터베이스를 사용할 수 있습니다. 그러나 교차 데이터베이스 테이블 조인에 대해서는 아무 것도 찾을 수 없습니다!

답변

1

드루팔은 한 번에 두 개 이상의 활성 데이터베이스를 가지고 지원하지 않습니다 (내가 마이그레이션 스크립트의 일부로 이것으로 찾고 있어요 및 old_data_source을 제거한다). 주된 이유는 아마 이것은 mysql 특정 기능 일 것이다.

PHP로이를 수행하고 Drupal 데이터베이스 레이어를 건너 뛸 수 있습니다. 한 번 실행해야하는 마이그레이션 스크립트에만 해당되므로 코드 데이터베이스를 특정하게 만드는 것이 좋습니다. 그냥 우리 mysql_ connect 등 아마도 사용을 끝내기 좋은 생각 db_set_active

4

테이블 접두어라는 기능에 의존하는 조금 알려진 트릭이 있습니다. settings.php를 구성하여 쿼리의 특정 테이블에 다른 데이터베이스의 이름을 접두어로 붙이면 데이터베이스 간 조인을 할 수 있습니다.

default.settings.php의 주석에있는 예를 살펴보십시오 (비슷한 구문이 Drupal 6에 적용됨).이를 설정하는 방법을 확인하십시오. 원래의 질문의 경우, 당신은 보이는 기본 $ 데이터베이스 항목에 접두사 배열을 것 같은 :

'prefix' => array('page' => 'old_data_source.'), 

그리고 같은과 쿼리를 작성 :

db_query("SELECT * FROM {node} n LEFT JOIN {page} p on n.nid=p.nid"); 

드루팔 홍보

SELECT * FROM node n LEFT JOIN old_data_source.page p on n.nid=p.nid; 

유일한 다른 것은 확인하기 위해 기본 드루팔 데이터베이스와 연관된 데이터베이스 사용자가 가지고 있다는 것입니다의 : DB 추상화 계층은 {페이지} 해석 것처럼 SQL로 변환합니다 두 데이터베이스에 모두 액세스 할 수 없거나이 트릭이 작동하지 않습니다.

1

날 전에 언급 한 settings.php 트릭에서 접두어를 사용하는 것 외에도 db_query()에 전달한 쿼리 문자열의 접두어 (질문과 유사)를 하드 코드 할 수 있습니다.

그래서이 경우 당신은

drupal.node inner join old_data_source.page on blablabla 

은 D7에 테스트 한 것입니다.

물론 db_set_active 인수에서 사용중인 사용자는 두 데이터베이스 모두에 액세스 할 수 있어야합니다.

3

저는 최근에이 문제에 직면했기 때문에이 답변에 추가하고 싶습니다. 멀리 떨어져있는 가장 쉬운 해결책 (나의 경우)은 배후에서 합류 한 mysql view을 생성하는 것이었다. 따라서 Drupal 자체에서 크로스 데이터베이스 조인이 필요하지 않습니다.