Броски миграции в Symfony 1.4 SQLSTATE [HY000]: Общая ошибка: 1005 (ошибка 150) - доктрина: миграция не удалась! - PullRequest
0 голосов
/ 26 июля 2011

Вот ситуация, которую я не мог разрешить сам.

У меня есть существующий проект 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, чтобы преследовать некоторых призраков, но НАДА!

Ошибка все еще происходит.

Кто-нибудь знает, что происходит или какое-то решение?

Есть предложения?

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Вы не должны использовать: 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 голосов
/ 27 июля 2011

Я взломал это.

По какой-то веселой причине автоматически сгенерированные классы миграции названы так:

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-db и doctrine:generate-migrations-models, но с этим урок Symfony по миграции не очень понятен.

Почему я использую их обоих?

Когда я сделал ./symfony doctrine:generate-migration-db, была создана только половина классов для миграции. Странно - есть только общие таблицы и никаких связанных! Поэтому я позвонил doctrine:generate-migrations-models.

Заключение

Другой вопрос: почему doctrine:generate-migrations-db не генерирует классы миграции для связанных таблиц модели?

...