Здесь и в других местах много обсуждается использование внешних баз данных в Drupal. Из этого я понял:
- Лучший способ работы с данными в таблице базы данных - использовать модуль Views. Я установил его и начал использовать, и обнаружил, что он отлично подходит для работы с таблицей, которую я добавил в базу данных сайта.
- Самый простой способ заставить Views работать с таблицей, которая не была создана Drupal, - это модуль Data. Этот модуль обрабатывает любую таблицу в базе данных сайта, которая не используется Drupal, как «потерянную таблицу» и позволяет ее «принять» одним нажатием кнопки.
- Модуль «Мастер таблиц», очевидно, предоставляет способ сделать это с таблицами, которых нет в базе данных сайта. Но этот модуль недоступен для Drupal 7.
- Файл «settings.php» в разделе «Настройки базы данных» содержит подробную документацию о том, как определить дополнительные базы данных, с которыми может работать сайт. Но когда база данных определена таким образом, ее таблицы не отображаются в списке потерянных таблиц в модуле данных.
Изменение, которое я внес в определение базы данных в файле «settings.php» одного из моих сайтов:
$databases = array (
'default' => array ('default' => array (
'database' => 'db_local',
'username' => 'db_local',
'password' => '_________',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
), ),
'extra' => array ('default' => array (
'database' => 'db__extra',
'username' => 'db_admin',
'password' => '_________,
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
), ), );
У меня есть таблица, которую я хочу использовать на нескольких сайтах в моей многосайтовой установке. Это означает, что мне нужно иметь таблицу в базе данных, доступной для каждого сайта. В соответствии с чтением, которое я сделал, мои варианты сделать это:
- Лучше всего, если это возможно: выясните, что есть способ заставить модуль данных распознавать таблицы в дополнительной базе данных, определенной в "settings.php", чтобы он мог их принять.
- Используйте префиксы таблиц, чтобы разрешить всем сайтам использовать одну базу данных.
- Модуль « Forena Reports », казалось, делал именно то, что мне нужно, но когда я его установил, я не смог заставить его работать. Я отправил проблему 2475645 и не смогу сделать там больше, если только не найдем решение этой проблемы.
- Напишите свой собственный модуль, чтобы предоставить Views доступ к дополнительной базе данных, определенной в "settings.php".
- Установите Drupal 6 с Table Wizard и используйте его, чтобы получить Views, чтобы увидеть мою внешнюю таблицу, а затем каким-то образом взять полученный результат и поместить его в Drupal 7. (Это предлагалось в некоторых постах.)
- Следуйте процедуре, описанной в https://drupal.stackexchange.com/a/3321/45991 , которая начинается с установки патча и, по-видимому, также требует создания моего собственного модуля.
- Я также рассмотрел модули Feeds, Feeds SQL, серверная часть Views XML и Migrate, но ни один из них не сказал, что они могут подключить внешнюю базу данных к Views. Я что-то пропустил? Является ли один из них правильным решением?
Вариант 2 не практичен, потому что это приведет к созданию огромной базы данных с сотнями таблиц, которыми будет очень трудно управлять. Я добился значительных успехов в начале работы с Drupal, но я не чувствую себя готовым выполнить задачи 4, 5 или 6. Есть ли какая-то возможность, как вариант 1, работать? Или есть какой-то другой способ заставить Views работать с таблицей вне базы данных сайта, не имея возможности написать свой собственный модуль?
Две дополнительные детали: первая таблица, с которой мне нужно работать, довольно большая, более 6000 строк и около 20 столбцов. Нет никакого намерения предоставлять посетителям сайта доступ к базе данных, за исключением информации, взятой из нее для содержимого страницы.
Спасибо за вашу помощь.
Я сделал это успешно несколькими способами:
Используйте представление SQL для создания виртуальной таблицы,
db_local
которая ссылается на соответствующую таблицу вdb__extra
. Запрос на создание, который будет выглядеть примерно так:USE db_local; CREATE VIEW some_table AS SELECT * FROM db__extra.some_table;
Затем вы можете ссылаться на это представление SQL, как если бы оно было собственной таблицей в вашей базе данных Drupal, и вам даже не нужно вообще добавлять внешнюю базу данных в settings.php. Обратите внимание, что это может быть несовместимо с модулем данных (см. Https://www.drupal.org/node/1973806 ), но вы должны иметь возможность описать представление SQL для модуля Drupal Views путем реализации
hook_views_data()
и прекратить использование модуля Data ,Вот еще одна возможность: использовать префиксы селективных таблиц, чтобы обманом заставить Drupal переписать {some_table} в db__extra.some_table. Это не то же самое, что префикс ваших таблиц Drupal.
Ваша
$databases
настройка будет выглядеть так:$databases = array ( 'default' => array ('default' => array ( 'database' => 'db_local', 'username' => 'db_local', 'password' => '_________', 'host' => 'localhost', 'port' => '', 'driver' => 'mysql', 'prefix' => array( 'some_table' => 'db__extra.', ), )) );
Опять же, я не уверен, что это совместимо с модулем данных, так как я не использую его. Но это должно работать с представлениями, если вы реализуете
hook_views_data()
себя.источник