【问题标题】:Symfony 1.4 migration throws SQLSTATE [HY000]: General error: 1005 (err 150) - doctrine:migrate fails!Symfony 1.4 迁移抛出 SQLSTATE [HY000]:一般错误:1005 (err 150) - 学说:迁移失败!
【发布时间】:2011-07-26 11:14:24
【问题描述】:

这是我自己无法解决的情况。

我有一个现有的 symfony 1.4 项目,其中包含数据库、模型等。我想做一个迁移,所以我已经完成了:

./symfony cc
./symfony doctrine:generate-migrations-db
./symfony doctrine:generate-migrations-model

迁移的所有类都已创建,因此我尝试通过以下方式应用迁移:

./symfony doctrine:drop-db
./symfony doctrine:build-db
./symfony doctrine migrate

迁移过程崩溃。它抛出一个错误:

- SQLSTATE[1005]: General error: 1005 Can't create table 'database.#sql-6df_301' (errno: 150). Failing Query: "ALTER TABLE product ADD CONSTRAINT "product_product_group_id_product_group_id FOREIGN KEY (product_group_id) REFERENCES product_group(id) ON DELETE CASCADE

这很奇怪。我有更多具有关系的表并且它们被创建,但是那个失败了。我已经检查了我能想到的一切。索引类型、表格类型、月相 - 一切似乎都正常。我尝试设置 FOREIGN_KEY_CHEKS=0 来追逐一些幽灵,但是 NADA!

错误依然存在。

有人知道发生了什么或有什么解决办法吗?

有什么建议吗?

【问题讨论】:

  • 我已经破解了它,但似乎我的声誉太低,STACKOVERFLOW 无法让我这么早回答我的问题。 5小时后我会发布答案。线索:错误排序的迁移文件。

标签: mysql symfony1 doctrine migration


【解决方案1】:

您不应该使用 :generate-migrations-models 。按顺序试一下

./symfony cc
./symfony doctrine:generate-migrations-db
./symfony doctrine:drop-db
./symfony doctrine:build-db
./symfony doctrine migrate

线

./symfony doctrine:generate-migrations-models

使用模型类来生成迁移。这并不总是一个好主意,因为你可能忘记了模型把事情搞砸了。为了清理那些被遗忘的模型,请在启动上述命令之前使用以下命令。

./symfony doctrine:clean-model-files

【讨论】:

  • 是的,我想通了。这两个任务的混合是问题所在。为迁移自动生成的文件排序错误,并且在创建所有表之前执行了 FK 创建。谢谢。
【解决方案2】:

我已经破解了。

出于某种有趣的原因,自动生成的迁移类的名称如下:

1311678541_add<table-name>.php
1311678542_add<table-name>.php
1311678543_add<table-name>.php
...
13116785578_addfks.php
...
1311678579_add<table-name>.php
1311678580_add<table-name>.php
1311678582_addproductgroup.php

13116785578_addfks.php 文件出现在1311678582_addproductgroup.php 之前。

文件13116785578_addfks.php 包含一个创建所有关系(外键和约束)的类,但它试图在一个不存在的表上添加约束(在我的例子中是product_group,它将最后创建)。所以,SQL 错误意味着YOU ARE TRYING TO CREATE A RELATION WITH UNEXISTING TABLE, YOU MORON! :)

我的解决方案是将13116785578_addfks.php 重命名为13116785590_addfks.php,因为它会强制原则合并机器将其作为最后一步执行。执行时,所有表都已创建,MySQL 服务器很高兴!

那么,这种错单的原因是什么?

可能是由于混合了任务doctrine:generate-migrations-dbdoctrine:generate-migrations-models, 但是 Symfony 的迁移教程对此不是很清楚。

为什么我同时使用它们?

当我完成./symfony doctrine:generate-migration-db 时,只创建了一半的迁移类。很奇怪——只有通用表,没有相关表!所以我打电话给doctrine:generate-migrations-models

结论

又提出一个问题:为什么doctrine:generate-migrations-db 不为模型的相关表生成迁移类?

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 2020-05-13
    • 2016-12-02
    • 2017-01-31
    • 2017-04-09
    • 1970-01-01
    • 2020-01-15
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多