尝试测试Symfony 2应用程序时出现SQL错误 - 列已存在,表缺失

Maj*_*ons 3 php automated-tests symfony doctrine-orm

我下面介绍的测试设置在这里这里也.当我尝试运行我的测试,并且测试数据库正在创建过程中时,我收到以下错误:

[Doctrine\ORM\Tools\ToolsException]
Schema-Tool失败并显示错误'执行'CREATE INDEX deletedAtidx ON SurveyHash(deletedAt)'时发生异常:
SQLSTATE [HY000]:常规错误:1执行DDL时,index_Add已存在': CREATE INDEX deletedAtidx ON SurveyHash(deletedAt)

[Doctrine\DBAL\Exception\TableExistsException]
执行'CREATE INDEX deletedAtidx ON SurveyHash(deletedAt)'时发生异常:
SQLSTATE [HY000]:一般错误:1 index deletedAtidx已存在

[Doctrine\DBAL\Driver\PDOException]
SQLSTATE [HY000]:一般错误:1 index deletedAtidx已存在

[PDOException]
SQLSTATE [HY000]:常规错误:1 index deletedAtidx已存在

doctrine:schema:create [--dump-sql] [--em [="..."]]

清除数据库

[Doctrine\DBAL\DBALException]
执行'DELETE FROM PageImage'时发生异常:
SQLSTATE [HY000]:一般错误:1没有这样的表:PageImage

[PDOException]
SQLSTATE [HY000]:一般错误:1没有这样的表:PageImage

doctrine:fixtures:load [--fixtures [="..."]] [--append] [--em ="..."] [--purge-with-truncate]

Doctrine\DBAL\Exception\TableNotFoundException:执行'SELECT t0.label AS label_1时发生异常,t0.value AS value_2 FROM设置t0 WHERE t0.label =?限制1'与params ["webservice"]:

SQLSTATE [HY000]:一般错误:1没有这样的表:设置

看着我的实体,该deletedAt指数是不是在我的声明两次SurveyHash实体,并且我有两个实体PageImageSetting,但不被创建的那些表,由sqliteman验证.进一步的测试(参见下面其中一个答案中的注释)表明,由于多个表使用相同的索引名称,它会引发错误.

config_test.yml有以下几点:

doctrine:
   dbal:
       driver: pdo_sqlite
       path: %kernel.cache_dir%/test.db
       charset: UTF8
   orm:
       auto_generate_proxy_classes: true
       auto_mapping: true
Run Code Online (Sandbox Code Playgroud)

由于NDA,我可以分享的数据库信息有点受限,所以我希望这些错误是上面链接或我的链接的结果config_test.yml.我正在使用Symfony 2.4.6,如果这有所不同.

Kho*_*oly 13

我认为您正在尝试doctrine:schema:update在数据集具有外键的表上执行操作,或者您尝试添加多个数据集.

你可以尝试的是删除数据库模式,重新创建它,然后用数据重新填充它.

所以先做php app/console doctrine:schema:drop --force,然后php app/console doctrine:schema:createdoctrine:fixtures:load.

我有同样的问题,这对我有用.

我刚刚飞过第一个链接,你正在做的是doctrine:schema:create多次调用,这当然不会起作用,因为你已经创建了它们.你只能用doctrine:schema:update --force它们或用drop/create重新创建!

回答

根据下面的评论这个答案错误是他给不同表上的不同索引同名,但是 names from index MUST be unique!