2016-08-31 10 views
0

私のDjangoモデルのいくつかの大きな変更を試しながら、私は真剣にすべてを台無しにしました。幸いにも、私は変更をコミットしていなかったので、私はすべての変更を落としました。次のステップは、自分のデータベースを元の状態に戻すことでした。最終的には、makemigrationsmigrateコマンドを問題なく正常に実行できるようになりました。しかし、私がサイトにアクセスしようとするたびに、ProgrammingErrorに私のテーブルtopspots_notificationが存在しないと言ってきます。明示的にテーブルを作成する移行を実行すると、Djangoテーブルが作成されません。

私は私のmigrationsフォルダに以下の移行ファイルがあります。そのテーブルを作成することになっている

# -*- coding: utf-8 -*- 
# Generated by Django 1.9.6 on 2016-08-25 15:52 
from __future__ import unicode_literals 

from django.conf import settings 
from django.db import migrations, models 
import django.db.models.deletion 


class Migration(migrations.Migration): 

    dependencies = [ 
     migrations.swappable_dependency(settings.AUTH_USER_MODEL), 
     ('topspots', '0018_siteuser_share_location'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='Notification', 
      fields=[ 
       ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 
       ('message', models.TextField()), 
       ('recipient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recipient_notification', to=settings.AUTH_USER_MODEL)), 
       ('sender', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sender_notification', to=settings.AUTH_USER_MODEL)), 
      ], 
     ), 
    ] 

を。この移行を具体的に実行しようとすると、そのテーブルが存在しないため、そのテーブルを参照する後の移行を未適用しようとすると失敗します。上記のマイグレーション(私のnotificationテーブルが作成されている場所)とその後ろにあるすべてのモデルを削除しようとしました。その後、makemigrationsmigrateをもう一度実行しますが、適用する移行はなく、私のテーブルはまだ作成されていません。

私の質問はなぜマイグレーションを実行するとテーブルが作成されないのですか?私は手動でMySQLでテーブルを作成できることを知っていますが、私はこのようにデータベースを台無しにしてしまったことを知りたいと思います。

私は、テーブルが作成されず、移行が適用されていないことに関連した多くのSO投稿を見ましたが、私にとってはまだ役に立たないものは見つかりませんでした。

  • 私のテーブルは "管理されていない"テーブルではありません。
  • マイグレーションをすべて削除して新しいマイグレーションを作成しようとしました。私は私の仮定が適用されないためにはDjangoを言っている私のデータベース自体に何かがあるということです

    プロジェクト全体のmigrateを実行しているだけでなく、特定のアプリのためのマイグレーションを実行しても、特定の移行

試してみました
  • 私は何を探すべきか分からない。

    何か提案がありがとうございます。ありがとうございました。

  • +0

    を助け

    希望任意のデータ損失のXDの責任になりたくありませんか?この移行は適用されているとマークしていますか? – knbk

    +0

    @knbk '[X]'が適用されている場合は、すべての移行が適用されたものとして表示されます。 – elethan

    +0

    適用されるすべての移行の履歴を保持するテーブルdjango_migrationsがあります。あなたはそれを見てみることができます。 – shubham003

    答えて

    2

    djangoは、移行のログをdjango_migrationsテーブルに保存します(データベース内で直接確認できます)ので、次回同じ移行を実行しようとするとdjangoにログが表示されますあなたはすでに一度それを実行し、それは再びテーブルを作成しようとしません。

    あなたは、そのテーブルを変更することによって、適用されるの移行をきれいにしようとし、再度マイグレーションを実行するか、または[推奨] --fakeを使用することにより、安全な地点に戻って行くことができる:

    は、あなたが移行0003で問題があったとしましょうと0002しかし、移行0001は大丈夫だった...そのバックアップを行ってください

    再び

    ./manage.py migrate my_app 0001 --fake 
    

    を行うことがdjango_migrationsテーブルの上に0002と0003の移行を削除し、あなたがそれらを再作成するか、新しいマイグレーションを実行することができます戻って移行0001に戻りますこれをテストする前に、データベースの:Pこれは `のpython manage.pyは何を示してshowmigrations`ん

    +0

    美しい。はい、これはトリックでした。私は以前、 'django_migrations'テーブルに実験的な変更を元に戻したときに既に取り除かれたマイグレーションの記録を持っていたのですが、どうしたらよいのか分からず、それらを忘れてしまっていました。そのテーブルがどのように機能し、どのようにポールブングルを解決するかについて、簡単に説明してくれてありがとう! – elethan

    関連する問題