РЕШЕНО: TYPO3 Controller: неизвестный столбец uid в списке полей при массовой вставке

Прежде всего, я использую 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, Мартин


person Martin Stundner    schedule 20.01.2021    source источник
comment
Пожалуйста, не ставьте решение в вопросе. Вот почему у нас есть ответы. Если у вас есть уникальный ответ, который сработал, укажите его как отдельный ответ. Не как редактирование вопроса.   -  person The Grand J    schedule 21.01.2021


Ответы (2)


На самом деле не уверен, но объединяя некоторые ответы, связанные с этим вопросом,

  • Отсутствует поле в таблице
  • Calling Hook (откуда-то из вашего списка добавочных номеров)

Отсутствующее поле:

Очевидно, у вас есть поле в том виде, в котором вы дали изображение.

Calling Hook (откуда-то из вашего списка добавочных номеров)

Иногда причиной такой проблемы может быть внешний вид. Здесь @Mondblut хорошо это объяснил.

Проблема с таблицей базы данных

Также может быть сбой таблицы базы данных. Я не совсем уверен, что это так. Но Вот уловка @Christiane!

Кроме того, если у вас есть другие копии вашего расширения, это может быть конфликтом. Следуйте инструкциям @Sybille здесь.

Надеюсь, это будет полезно!

person GNB    schedule 20.01.2021

Хорошо, я обнаружил ошибку.

К сожалению, подсказки по решению от @GNB не помогли мне получить правильный результат.

Однако я попытался инкапсулировать ячейки в CSV с помощью "<value>" и: это работает!

В любом случае, я изменил механизм резервного копирования с

  • Экспорт в CSV
  • Импорт из CSV

to:

  • Скопируйте таблицу в резервную копию, которая создается до того, как будет иметь такую ​​же схему (CREATE .. LIKE ..)
  • Просто скопируйте значения обратно, в случае ошибки

Спасибо за вашу помощь.

BR, Мартин

person Martin Stundner    schedule 21.01.2021