Кросс-таблицы таблиц присоединяются в Drupal? - PullRequest
0 голосов
/ 05 августа 2010

Возможно ли выполнять перекрестное объединение баз данных в drupal?

Допустим, у вас есть две базы данных, drupal и old_data_source.Вы хотите присоединиться drupal.node к old_data_source.page.

db_set_active() можно вызвать для использования нескольких баз данных.Однако не могу найти ничего о соединениях между таблицами базы данных!

(я рассматриваю это как часть скрипта миграции и буду удалять old_data_source)

Ответы [ 4 ]

4 голосов
/ 19 марта 2012

Для этого существует малоизвестный прием, основанный на функции, называемой префиксом таблиц.Вы можете сконфигурировать ваш файл settings.php так, чтобы префикс определенных таблиц в ваших запросах назывался именем другой базы данных, чтобы вы могли выполнять объединения между базами данных.

Посмотрите примеры в комментариях к default.settings.php (аналогичный синтаксис применяется в Drupal 6), чтобы увидеть, как это настроить.В случае исходного вопроса у вас будет запись префикса в вашей записи $ database по умолчанию, которая выглядит следующим образом:

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

, а затем создаете запрос с чем-то вроде:

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

Уровень абстракции БД Drupal интерпретирует {страницу} и преобразует его в SQL следующим образом:

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

Единственное, что нужно убедиться в том, что пользователь базы данных, связанный с базой данных Drupal по умолчанию, имеет привилегииполучить доступ к обеим базам данных, иначе этот трюк не сработает.

3 голосов
/ 06 августа 2013

Я просто хотел бы добавить к этому ответу, потому что я недавно столкнулся с этой проблемой.Самым простым решением на данный момент (в моем случае) было создание mysql view , который выполнял закулисное соединение.Это устраняет необходимость в перекрестном соединении с базой данных внутри самого drupal.

1 голос
/ 19 марта 2012

Помимо использования префикса в уловке settings.php, о котором я говорил ранее, вы также можете жестко закодировать префикс в строке запроса, которую вы передаете db_query () (аналогично тому, что вы сделали в своем вопросе).

Так что в этом случае вы должны были бы

drupal.node inner join old_data_source.page on blablabla

протестировать на d7.

Конечно, пользователь, которого вы используете в аргументе db_set_active, должен иметь доступ к обеим базам данных.

1 голос
/ 05 августа 2010

Drupal не поддерживает одновременное использование более одной активной базы данных. Основная причина, вероятно, в том, что это особенность mysql.

Вы можете сделать это с помощью php и пропустить слой базы данных Drupal. Так как это только для сценария миграции, который должен быть запущен один раз, хорошо будет сделать базу данных кода специфичной. Только мы mysql_ connect и т. Д. Вероятно, будет хорошей идеей прекратить использование db_set_active

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...