已解决:TYPO3 控制器:批量插入时“字段列表”中未知列“uid”

问题描述 投票:0回答:2

首先,我使用 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,但是没有:

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));

即使在数据库中,该字段也存在:

如果我尝试通过后端手动添加查询,我会收到相同的错误。如果我尝试使用管理员仪表板中的“新数据集”按钮添加新条目,它会起作用。即使我复制命令并使用不同的 ID 再次添加条目,它仍然可以工作 - 那么我在控制器恢复期间缺少什么?

工作指令:

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 的解决方案提示并没有帮助我得到正确的结果。

但是,我尝试用

"<value>"
将单元格封装在 csv 中并且:它有效!

无论如何,我改变了备份机制

  • 导出为 csv
  • 从 csv 导入

至:

  • 将表复制到备份表,该表是在具有相同架构之前创建的(CREATE .. LIKE ..)
  • 只需将值复制回去,以防出现错误

感谢您的帮助。

BR, 马丁

sql doctrine typo3 typo3-9.x typo3-extensions
2个回答
1
投票

实际上不确定,但结合了与这个问题相关的一些答案,

  • 表中缺少字段
  • 呼叫 Hook(从分机列表中的某个位置)

缺少字段:

显然,您拥有提供图像的字段。

呼叫 Hook(从分机列表中的某个位置)

有时外部可能是造成此类问题的原因。 这里 @Mondblut 解释得很好。

数据库表问题

数据库表故障也可能存在。我不太确定情况是否如此。但是,这里是@Christiane的技巧!

此外,如果您有扩展的其他副本,这可能会发生冲突。按照@Sybille here的指示进行操作。

希望这会有所帮助!


0
投票

好吧,我发现错误了。

不幸的是,@GNB 的解决方案提示并没有帮助我得到正确的结果。

但是,我尝试用

"<value>"
封装 csv 中的单元格并且:它有效!

无论如何,我改变了备份机制

  • 导出为 csv
  • 从 csv 导入

至:

  • 将表复制到备份表,该表是在具有相同架构之前创建的(CREATE .. LIKE ..)
  • 如果出现错误,只需将值复制回去即可
© www.soinside.com 2019 - 2024. All rights reserved.