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

Php 尝试测试Symfony 2应用程序时出现SQL错误-列已存在,缺少表,php,symfony,doctrine-orm,automated-tests,Php,Symfony,Doctrine Orm,Automated Tests,我正在遵循所描述的测试设置。当我试图运行我的测试,并且测试数据库正在创建过程中时,我得到以下错误: [条令\ORM\Tools\ToolsException] 架构工具失败,错误为“在SurveyHash(deletedAt)上执行“创建索引deletedAtidx”时发生异常: SQLSTATE[HY000]:一般错误:在SurveyHash(deletedAt)上执行DDL:CREATE index deletedAtidx时,1个索引deletedAtidx已存在 [条令\DBAL\Exc

我正在遵循所描述的测试设置。当我试图运行我的测试,并且测试数据库正在创建过程中时,我得到以下错误:

[条令\ORM\Tools\ToolsException]
架构工具失败,错误为“在SurveyHash(deletedAt)上执行“创建索引deletedAtidx”时发生异常:
SQLSTATE[HY000]:一般错误:在SurveyHash(deletedAt)上执行DDL:CREATE index deletedAtidx时,1个索引deletedAtidx已存在

[条令\DBAL\Exception\TableExistsException]
执行“在SurveyHash(deletedAt)上创建索引deletedAtidx”时发生异常:
SQLSTATE[HY000]:一般错误:1索引deletedAtidx已存在

[原则\DBAL\Driver\PDOException]
SQLSTATE[HY000]:一般错误:1索引deletedAtidx已存在

[PDO例外]
SQLSTATE[HY000]:一般错误:1索引deletedAtidx已存在

条令:模式:创建[--dump sql][--em[=“…”]]

清除数据库

[条令\DBAL\DBALException]
执行“从页面图像删除”时发生异常:
SQLSTATE[HY000]:一般错误:1没有这样的表:PageImage

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

条令:装置:加载[--fixtures[=“…”][--append][--em=“…”[--purge with truncate]

条令\DBAL\Exception\TableNotFoundException:执行“从设置t0中选择t0.label作为标签_1,t0.value作为值_2,其中t0.label=”时发生异常?使用参数[“webservice”]限制1':

SQLSTATE[HY000]:一般错误:1无此类表:设置

查看我的实体,
deletedAt
索引在我的
SurveyHash
实体中没有声明两次,并且我有
PageImage
Setting
的实体,但是这些表没有被创建,正如sqliteman所验证的那样。进一步的测试(请参见下面答案之一中的注释)表明,由于多个表使用相同的索引名,它抛出了一个错误

My
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

由于保密协议,我可以共享的数据库信息有点有限,所以我希望这些错误是由于上面的链接或我的
config\u test.yml
中的某些内容造成的。我使用的是Symfony 2.4.6,如果有区别的话。

您可能已经复制了deletedAtidx。在映射配置中搜索它。 如果没有,请尝试重新创建数据库(如果没有重要数据)

原则:装置:加载


尝试
document:schema:update--force

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

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

因此,首先做一个
php应用程序/控制台原则:schema:drop--force
,然后做
php应用程序/控制台原则:schema:create
,然后做
原则:fixtures:load

我也有同样的问题,这对我很有效

我刚刚浏览了第一个链接,您要做的是多次调用
原则:schema:create
,当然这不起作用,因为您已经创建了它们。您只能
doctrine:schema:update--force
或使用drop/create重新创建它们

回答


根据下面的评论,这个答案的错误在于,他给不同表上的不同索引赋予了相同的名称,但索引中的
名称必须是唯一的

好吧,我尝试手动删除,然后通过控制台创建模式,遇到了同样的问题。我可以删除它,它会列出所有表都已删除。我可以创建模式,但它只创建一个空的test.db文件。当我手动运行更新时,它会给出相同的错误,并且在我需要的30个表中只创建了20个。删除索引可以解决问题—没有错误,并且创建了所有db表—但这并不能真正解决问题。真正奇怪的是,它是一个
条令\DBAL\Exception\TableException
,没有在条令2.2的API中列出,正如我所说,我已经检查了有问题的实体,没有一个索引被多次声明。所以,这些错误的出现令人困惑。真正奇怪的是,更改有问题索引的名称也可以修复它。因此,如果我在一个表中命名一个
deletedataidx
,然后在另一个表中命名另一个
deletedata\u idx
,它就会工作。这几乎就像是在整个数据库上强制执行
UNIQUE
约束,而AFAIK并不是它应该如何工作的。在同一数据库中的多个表上可能有同名的唯一索引,对吗?否,取自:
字段,用于索引功能的字段在数据库中必须是唯一的。具有相同“按字段索引”值的多个实体的行为尚未定义。
因此我猜测,不仅实体字段必须是唯一的,索引也必须是唯一的!是的,我在我的项目中测试了它,在那里我也使用索引。我以前给它们起过不同的名字,只是因为它对我来说很合适,但我从来没有想过。我用同样的名字试了一下,结果还是一样的错误!我将在我的答案中编辑它,这样未来的读者就不必搜索评论:)