Невозможно вставить в пользовательскую таблицу, определенную в hook_schema
У меня есть следующие две почти идентичные таблицы базы данных, определенные в моем пользовательском модуле.install-file. Таблица 'plugin_data' выдает ошибку, когда я пытаюсь вставить в нее. Таблица 'plugin_data_kaks' работает как положено, вставляя данные.
Несмотря на то, что он уже работает, меня интересует, что пошло не так с первой попытки с таблицей plugin_data? Являются ли слова 'ключ' и 'значение' зарезервированными словами в db-api / schema-api?
hook_schema:
// This one is buggy and data cannot be inserted into it
$schema['plugin_data'] = array(
'description' => 'Stores plugin data.',
'fields' => array(
'id' => array(
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Primary Key: Unique ID.',
),
'plugin_id' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => 'Plugin machine name.',
),
'key' => array(
'type' => 'varchar',
'length' => 255,
'description' => 'Data key',
'not null' => TRUE,
),
'value' => array(
'type' => 'text',
'description' => 'Data value',
'not null' => TRUE,
'serialize' => TRUE,
),
),
'primary key' => array('id'),
);
// This one works as expected
$schema['plugin_data_kaks'] = array(
'description' => 'Plugin data',
'fields' => array(
'id' => array(
'description' => 'Plugin data primary key',
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
),
'plugin_id' => array(
'description' => 'Plugin id',
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
),
'data_key' => array(
'description' => 'Data key',
'type' => 'varchar',
'not null' => TRUE,
'length' => 100
),
'data_value' => array(
'description' => 'Data value',
'type' => 'text',
'not null' => TRUE,
'serialize' => TRUE
),
),
'primary key' => array('id'),
);
Попытка вставки:
// Value to be serialized and inserted
$data = [
'hello' => 'world',
'asd' => 'asd',
];
// This one works
$conn = Database::getConnection();
$result = $conn->insert('plugin_data_kaks')->fields(
array(
'plugin_id' => 'test',
'data_key' => 'testkey',
'data_value' => serialize($data),
)
)->execute();
// This one throws an error
$conn = Database::getConnection();
$result = $conn->insert('plugin_data')->fields(
array(
'plugin_id' => 'test',
'key' => 'testkey',
'value' => serialize($data),
)
)->execute();
Вот ошибка, выдаваемая вставкой таблицы 'plugin_data':
1205 07/Dec 14:03 error php Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in
your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key,
value) VALUES ('test', 'testkey', 'a:2:{s:5:\"hello\";s:5:\"world\";s:3:\"a' at line 1: INSERT INTO {plugin_data}
(plugin_id, key, value) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2); Array
(
[:db_insert_placeholder_0] => test
[:db_insert_placeholder_1] => testkey
[:db_insert_placeholder_2] => a:2:{s:5:"hello";s:5:"world";s:3:"asd";s:3:"asd";}
)
in Drupal\api_integraatio\Plugin\ApiIntegraatio\TestiSourcePlugin->process() (line 45 of
/var/www/drupalvm/web/modules/custom/api_integraatio/src/Plugin/ApiIntegraatio/TestiSourcePlugin.php).