База данных::setActiveConnection()
просто устанавливает в качестве активного соединения соединение, определенное в файле settings.php или добавленное из предыдущего вызова База данных:: аддконнектионинфо()
.
Правильный код будет следующим.
$postgis_database = [
'база данных' => $drugis_postgis_connection->getdatabase(),
'имя пользователя' => $drugis_postgis_connection->getusername(),
'пароль' => $drugis_postgis_connection->getpassword(),
'хост' => $drugis_postgis_connection->gethost(),
'драйвер' => 'pgsql',
];
// $ключ $цель
Database::addConnectionInfo('postgis','default', $postgis_database);
// $целевой ключ $
Database::setActiveConnection('по умолчанию', 'postgis');
Обратите внимание на порядок параметров в последних двух вызовах метода. Обратите также внимание на порядок индексов массива, используемый в $база данных
массив, заданный в файле settings.php.
// $ключ $цель
$базы данных['по умолчанию']['по умолчанию'] = [
'база данных' => 'имя базы данных',
'имя пользователя' => 'sqlusername',
'пароль' => 'sqlpassword',
'хост' => 'локальный хост',
'порт' => '3306',
'драйвер' => 'mysql',
'префикс' => '',
'сопоставление' => 'utf8mb4_general_ci',
];
Соединения, добавленные с База данных:: аддконнектионинфо()
не являются постоянными; они добавляются к статическому свойству База данных
учебный класс. Все функции/методы, которые хотят использовать соединение, определенное в $postgis_database
необходимо выполнить код, который я показал, прежде чем запрашивать базу данных или сохранять значения в базе данных.
Возможно, лучше добавить дополнительные подключения в настройках.
Ошибкой, которую следует избегать, является вызов функций Drupal, которые запрашивают определенную таблицу базы данных Drupal после вызова База данных::setActiveConnection('по умолчанию', 'postgis')
. Например, вызов таксономия_term_load_multiple_by_name()
после База данных::setActiveConnection('по умолчанию', 'postgis')
не будет работать, за исключением случая, когда база данных postgis/default содержит копию таблиц, используемых в Drupal. (Обычно это не так, поскольку модуль, использующий другую базу данных, не собирается делать копии таблиц, которые Drupal ожидает найти в этой базе данных.)
Перед вызовом таких функций, как таксономия_term_load_multiple_by_name()
, код должен вызывать База данных::setActiveConnection()
, который восстанавливает активное соединение с соединением по умолчанию, используемым Drupal, которое предназначено для базы данных, содержащей все таблицы, используемые из Drupal.