Таблица базы данных Cross в Drupal?
-
26-09-2019 - |
Вопрос
Можно ли сделать база базы данных в 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, должен иметь доступ к обоим базам данных.