【问题标题】:SQL errors when attempting to test Symfony 2 app - columns already exist, tables missing尝试测试 Symfony 2 应用程序时出现 SQL 错误 - 列已存在,表丢失
【发布时间】:2014-08-22 11:52:45
【问题描述】:

我正在遵循herealso here 中描述的测试设置。当我尝试运行我的测试并且正在创建测试数据库时,我收到以下错误:

[Doctrine\ORM\Tools\ToolsException]
Schema-Tool 失败并出现错误“执行“CREATE INDEX deletedAtidx ON SurveyHash (deletedAt)”时发生异常:
SQLSTATE[HY000]: 一般错误: 1 index deletedAtidx already exists' while execution DDL: 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 已经存在

[PDO异常]
SQLSTATE[HY000]: 一般错误: 1 index deletedAtidx 已存在

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

清除数据库

[Doctrine\DBAL\DBALException]
执行“DELETE FROM PageImage”时发生异常:
SQLSTATE[HY000]: 一般错误: 1 no such table: PageImage

[PDO异常]
SQLSTATE[HY000]: 一般错误: 1 no such table: 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 Setting t0 WHERE t0.label = 时发生异常LIMIT 1' with params ["webservice"]:

SQLSTATE[HY000]: 一般错误: 1 no such table: Setting

查看我的实体,deletedAt 索引没有在我的 SurveyHash 实体中声明了两次,并且我有 PageImageSetting 的实体,但这些表不是t 正在创建,由 sqliteman 验证。进一步测试(请参阅下面的答案之一中的 cmets)表明,由于多个表使用相同的索引名称,它会引发错误。

我的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_test.yml 中的某些内容造成的。我正在使用 Symfony 2.4.6,如果这有影响的话。

【问题讨论】:

    标签: php symfony doctrine-orm automated-tests


    【解决方案1】:

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

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

    所以首先做一个php app/console doctrine:schema:drop --force,然后是php app/console doctrine:schema:create,然后是doctrine:fixtures:load

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

    我刚刚飞过第一个链接,而您正在做的是多次致电doctrine:schema:create,这当然行不通,因为您已经创建了它们。您只能 doctrine:schema:update --force 他们或使用 drop/create 重新创建!

    回答

    根据此答案下方的 cmets,错误是他在不同表上为不同的索引提供了相同的名称,但 names from index MUST be unique!

    【讨论】:

    • 好吧,我尝试手动删除,然后通过控制台创建架构,并遇到了同样的问题。我可以删除它,它会列出所有表都已删除。我可以创建架构,但它只创建一个 empty test.db 文件。当我手动运行更新时,它给出了相同的错误,并且只创建了我需要的 30 个表中的 20 个。删除索引可以解决问题 - 没有错误并且创建了所有 db 表 - 但这并没有真正解决问题。真正奇怪的是它是一个Doctrine\DBAL\Exception\TableException,它没有在 Doctrine 2.2 的 API 中列出
    • 就像我说的,我已经检查了有问题的实体,并且它们的索引都没有被多次声明。所以,出现这些错误真是令人费解。
    • 真正奇怪的是更改有问题的索引的名称也可以修复它。所以,如果我在一个表中命名一个deletedAtidx,然后在另一个表中命名另一个deletedAt_idx,它就可以工作。这几乎就像它在整个数据库上强制 UNIQUE 约束,AFAIK 不是它应该如何工作的。在同一个数据库中的多个表上可以有同名的唯一索引,对吗?
    • 不,取自documentation:Fields that are used for the index by feature HAVE to be unique in the database. The behavior for multiple entities with the same index-by field value is undefined. 所以我猜不仅实体字段必须是唯一的,索引也必须是唯一的!
    • 是的,我在我也使用索引的项目中对其进行了测试。我之前给它们取了不同的名字,只是因为它适合我,但我从来没有想过。我用相同的名字试了一下,得到了同样的错误!我将在我的答案中对其进行编辑,这样未来的读者就不必搜索 cmets :)
    【解决方案2】:

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

    你应该在doctrine:fixtures:load之前使用命令doctrine:schema:create

    试试doctrine:schema:update --force

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多