How to use database prefixes and Drupal 9 insert() method
Я разрабатываю специальный модуль для сайта Drupal 9. Я пытаюсь выполнить INSERT в удаленной базе данных PostgreSQL. Так...
База данных имеет несколько схем: общедоступная, содержимое, офис, ... Итак, в
sites/default/settings.php
У меня есть это:
$databases['remotedb']['default'] = array (
'database' => 'mydatabase',
'username' => 'user',
'password' => 'pass123',
'prefix' => '',
'host' => '123.456.78.901',
'port' => '5432',
'namespace' => 'Drupal\\Core\\Database\\Driver\\pgsql',
'driver' => 'pgsql',
);
$databases['remotedb']['office'] = array (
'database' => 'mydatabase',
'username' => 'user',
'password' => 'pass123',
'prefix' => 'office.',
'host' => '123.456.78.901',
'port' => '5432',
'namespace' => 'Drupal\\Core\\Database\\Driver\\pgsql',
'driver' => 'pgsql',
);
Я выполнил успешные запросы SELECT, используя ['remotedb']['default'], например:
$db = \Drupal\Core\Database\Database::getConnection('default', 'remotedb');
$q = $db->query("SELECT price FROM contents.categories WHERE id=:categoryId", [':categoryId' => $categoryId]);
$res = $q->fetchCol();
Теперь я пытаюсь выполнить INSERT, используя
insert()
метод, как это рекомендовано в Drupal Docs. Сначала у меня не было задано ['remotedb']['office'], поэтому у меня были такие ошибки, как "таблица не существует".
Итак, после исследования я подумал, что должен использовать
prefix
и вот как ['remotedb']['office'] оказался в
settings.php
.
Мой код INSERT теперь выглядит так:
$db = \Drupal\Core\Database\Database::getConnection('office', 'remotedb');
$q = $db->insert('credits')->fields(['amount' => $amount,'type' => $type,]);
$res = $q->execute();
Но я получаю эту ошибку
$res = $q->execute();
линия:
Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[42602]: Invalid name: 7 ERROR:
invalid name syntax LINE 6: AND pg_attribute.attrelid = '."office"."credits"'::re... ^:
SELECT pg_attribute.attname AS column_name, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type,
pg_get_expr(pg_attrdef.adbin, pg_attribute.attrelid) AS column_default
FROM pg_attribute LEFT JOIN pg_attrdef ON pg_attrdef.adrelid = pg_attribute.attrelid AND pg_attrdef.adnum = pg_attribute.attnum
WHERE pg_attribute.attnum > 0 AND NOT pg_attribute.attisdropped AND pg_attribute.attrelid = :key::regclass
AND (format_type(pg_attribute.atttypid, pg_attribute.atttypmod) = 'bytea' OR
pg_get_expr(pg_attrdef.adbin, pg_attribute.attrelid) LIKE 'nextval%');
Array ( [:key] => ."office"."credits" )
in Drupal\myoffice\Service\CreditFunctions->addCredit() (line 91 of modules/custom/myoffice/src/Service/CreditFunctions.php).
Это сводит меня с ума. Я пробовал несколько вещей, но ничего не помогло. В конце концов я получаю ту же ошибку.
Единственный способ выполнить этот INSERT - это использовать
query()
, и нет
insert()
метод.
Думаю, мои вопросы будут такими:
- возможно ли выполнить INSERT с помощью DatabaseAPI
insert()
метод для таблицы с префиксом (в непубличной схеме)? Что я делаю неправильно? что мне не хватает? - как следует
prefix
использоваться вinsert()
метод?