2011-07-26 50 views
0

這是我自己無法解決的情況。Symfony 1.4遷移拋出SQLSTATE [HY000]:一般錯誤:1005(錯誤150) - 教條:遷移失敗!

我有一個現有的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!

該錯誤仍然存​​在。

有誰知道發生了什麼或一種解決方案?

有什麼建議嗎?

+0

我已經破解了它,但對於STACKOVERFLOW來說,我的信譽似乎太低,以至於我不能早日回答我的問題。 5個小時後,我會發布答案。線索:錯誤訂購的遷移文件。 – Lyubo

回答

0

我已經破解了它。

在一些熱鬧的原因自動生成的遷移類的名字是這樣的:

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服務器很開心!

那麼,這種錯誤排序的原因是什麼?

也許這造成mixi'n了以任務doctrine:generate-migrations-dbdoctrine:generate-migrations-models, 但Symfony的的遷移教程不是很清楚這一點。

爲什麼我用它們呢?

當我完成./symfony doctrine:generate-migration-db時,只創建了一半的遷移類。很奇怪 - 只有一般的桌子,沒有相關的!所以我打電話給doctrine:generate-migrations-models

結論

另一個問題提出:爲什麼doctrine:generate-migrations-db不生成模型的相關表遷移類?

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 
+0

是的,我想通了。與這兩項任務混合在一起就成了問題。遷移的自動生成文件被錯誤排序,並且在創建所有表之前執行FK創建。謝謝。 – Lyubo