Прежде всего, я использую TYPO3 9.5.9 и Doctrine QueryBuilder / ConnectionPool.
Я попытался сделать резервную копию и восстановить со стороны контроллера. Мне пока удалось добраться до точки восстановления, мой код восстановления контроллера:
public static function loadBackup(array $backupSettings):int {
$affectedRows = 0;
$tableNames = explode(',', $backupSettings['tableNames']);
$tablePrefix = $backupSettings['tablePrefix'];
$backupPath = $backupSettings['path']. date("Ymd")."/";
foreach($tableNames as $table){
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getConnectionForTable($tablePrefix . $table);
$csv = array_map('str_getcsv', file($backupPath . $tablePrefix . $table . '.csv'));
array_walk($csv, function(&$a) use ($csv) {
$a = array_combine($csv[0], $a);
});
$headers = $csv[0];
array_shift($csv);
$affectedRows += $queryBuilder->bulkInsert(
$tablePrefix . $table,
$csv,
$headers
);
}
return $affectedRows;
}
Этот код пока работает, но при восстановлении возникает исключение:
[ERROR] An exception occurred while executing 'INSERT INTO `tx_****_domain_model_link` (`uid`, `pid`, `tstamp`,
`crdate`, `cruser_id`, `deleted`, `hidden`, `datasource`, `sha1`, `title`, `url`) VALUES (?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?)' with params ["900000000", "1", "0", "0", "0", "1", "0", "0", "", "```", ""]:
Unknown column 'uid' in 'field list'
Doctrine\DBAL\Exception\InvalidFieldNameException thrown in line 60 in file
/var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php
Сначала я подумал, что uid отсутствует в определении db /, но нет:
CREATE TABLE tx_****_domain_model_link (
uid int(11) unsigned NOT NULL AUTO_INCREMENT,
pid int(11) unsigned NOT NULL DEFAULT '0',
datasource smallint(5) unsigned NOT NULL DEFAULT '0',
sha1 varchar(40) DEFAULT '' NOT NULL,
title varchar(255) NOT NULL DEFAULT '',
url varchar(1024) DEFAULT '' NOT NULL,
PRIMARY KEY (uid));
Если я попытаюсь добавить запрос вручную через бэкэнд, я получу ту же ошибку. Если я попытаюсь добавить новую запись с помощью кнопки «Новый набор данных» на панели управления администратора, она сработает. Даже если я скопирую команду и снова добавлю запись с другим идентификатором, она работает - так что мне не хватает при восстановлении контроллера?
Рабочая команда:
INSERT INTO `tx_****_domain_model_link` (`uid`, `pid`, `tstamp`, `crdate`, `cruser_id`, `deleted`, `hidden`, `datasource`, `sha1`, `title`, `url`) VALUES ('23123123', '0', '0', '0', '0', '0', '0', '0', '', '', '');
Любая помощь очень ценится!
BR, Мартин
ОБНОВЛЕНИЕ: найдено решение:
Хорошо, я обнаружил ошибку.
К сожалению, подсказки по решению от @GNB не помогли мне получить правильный результат.
Однако я попытался инкапсулировать ячейки в CSV с помощью "<value>"
и: это работает!
В любом случае, я изменил механизм резервного копирования с
- Экспорт в CSV
- Импорт из CSV
to:
- Скопируйте таблицу в резервную копию, которая создается до того, как будет иметь такую же схему (CREATE .. LIKE ..)
- Просто скопируйте значения обратно, в случае ошибки
Спасибо за вашу помощь.
BR, Мартин