Вопрос

Можно ли сделать база базы данных в Drupal?

Скажем, у вас есть две базы данных, drupal а также old_data_source. Отказ Ты хочешь присоединиться drupal.node к old_data_source.page.

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

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

Это было полезно?

Решение

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

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

Другие советы

Существует небольшое известный трюк для достижения этого, который опирается на функцию под названием Pature Prefixing. Вы можете настроить ваши настройки .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");

Слой абстракции Drupal DB будет интерпретировать и преобразовать его в SQL, как:

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

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

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

В дополнение к использованию префикса в CRESTACTS.PHP TRICK, отмеченном перед мной, вы также можете жестко определить префикс в строке запроса, которая вы передаваете DB_Query () (аналогично тому, что вы сделали в вашем вопросе).

Так что в этом случае у вас будет

drupal.node inner join old_data_source.page on blablabla

Проверено на D7.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top