已解决:TYPO3 控制器:批量插入时“字段列表”中的“uid”列未知 缺少字段:Calling Hook来自分机列表中的某处数据库表问题

问题描述

首先,我使用 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","","```",""]:                                  
                                                                                                                    
     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  

首先,我认为 db/definition 中缺少 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));

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

Table definition

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

工作指令:

INSERT INTO `tx_****_domain_model_link` (`uid`,`url`) VALUES ('23123123','0','','');

非常感谢任何帮助!

BR, 马丁

更新:找到解决方案:

好的,我发现了错误。

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

但是,我尝试使用 "<value>" 将单元格封装在 csv 中,并且:它有效!

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

  • 导出到 csv
  • 从 csv 导入

到:

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

感谢您的帮助。

BR, 马丁

解决方法

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

  • 表中缺少字段
  • Calling Hook(来自分机列表中的某处)

缺少字段:

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

Calling Hook(来自分机列表中的某处)

有时外部因素可能是导致此类问题的原因。 Here @Mondblut 很好地解释了这一点。

数据库表问题

数据库表故障也可能存在。我不确定情况是否如此。但是,Here 是@Christiane 的伎俩!

此外,如果您有一些其他的扩展副本,这可能是一个冲突。按照@Sybille here 的说明进行操作。

希望这会有所帮助!

,

好的,我发现了错误。

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

但是,我尝试使用 "<value>" 将单元格封装在 csv 中,并且:它有效!

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

  • 导出到 csv
  • 从 csv 导入

到:

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

感谢您的帮助。

BR, 马丁

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...