2

次のような簡単な移行があります。

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.add_column('activities_newsitem', 'related_story', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['projects.Story'], null=True, blank=True),keep_default=True)

残念ながら、それは失敗し、その理由はわかりません。以下は出力です。列の追加クエリが正常に実行されることに注意してください。実際、DB を見ると、列は正しくそこにあります。

しかし、何らかの理由で、後でドロップ列を実行しているため、失敗します。なぜそれをしているのですか?

DEBUG south execute "ALTER TABLE `activities_newsitem` ADD COLUMN `related_story_id` integer NULL;" with params "[]" (generic.py:145)
DEBUG south execute "ALTER TABLE `activities_newsitem` ADD CONSTRAINT `related_story_id_refs_id_3d3841088db0fdb0` FOREIGN KEY (`related_story_id`) REFERENCES `projects_story` (`id`);" with params "[]" (generic.py:145)
DEBUG south execute "CREATE INDEX `activities_newsitem_related_story_id` ON `activities_newsitem` (`related_story_id`);" with params "[]" (generic.py:145)
DEBUG south execute "ALTER TABLE `activities_newsitem` ADD COLUMN `related_story_id` integer NULL;" with params "[]" (generic.py:145)
DEBUG south execute "ALTER TABLE `activities_newsitem` ADD CONSTRAINT `related_story_id_refs_id_3d3841088db0fdb0` FOREIGN KEY (`related_story_id`) REFERENCES `projects_story` (`id`);" with params "[]" (generic.py:145)
DEBUG south execute "ALTER TABLE `activities_newsitem` DROP COLUMN `related_story_id` CASCADE;" with params "[]" (generic.py:145)
 ! Error found during real run of migration! Aborting.

 ! Since you have a database that does not support running
 ! schema-altering statements in transactions, we have had 
 ! to leave it in an interim state between migrations.

助けてくれてありがとう

4

1 に答える 1

1

コマンドを 2 回実行しようとしたようです。移行フォルダを見ると、同じ移行が 2 つありますか? 実際に移行せずに create migration コマンドを 2 回実行すると、これが発生する可能性があります。

誤ってコマンドを 2 回実行しましたか? これは、データベース コンソールを開いて、移行が south_migrationhistory テーブルにあるかどうかを確認することで確認できます。

unixy システム (OSX/Linux) を使用していると仮定すると、コマンドラインから:

mysql -u username -p password

それから

select * from south_migrationhistory;

あなたの移行はそこにありますか?

もしそうなら、あなたの仕事は終わったので、次に進むことができます。そうでなく、 activities_newsitem テーブルに列がある場合は、南部の移行履歴を最新のものにするために、移行を偽造する必要があります。

移行を偽装するには:

python manage.py migrate activities --fake 0001

ここで、0001 は移行番号です (すべての移行ファイルには番号のプレフィックスが付きます)。

于 2012-06-19T01:08:16.267 に答える