移行がまだ適用されているかどうかをdjangoはどうやって知るのですか? 通常は正しく処理されますが、そうでない場合は、どこからトラブルシューティングを開始すればよいかわかりません。
5 に答える
他の回答が述べているように、django にはdjango_migrations
移行履歴を保持する特別なテーブルがあります。
もう少し掘り下げることに興味がある場合は、データベースに移行を記録するMigrationRecorder
クラスを参照してください。django_migrations
また、テーブルの基になるモデルは次のとおりです。
class Migration(models.Model):
app = models.CharField(max_length=255)
name = models.CharField(max_length=255)
applied = models.DateTimeField(default=now)
class Meta:
apps = Apps()
app_label = "migrations"
db_table = "django_migrations"
def __str__(self):
return "Migration %s for %s" % (self.name, self.app)
使用showmigrations
は、基本的なユース ケースに最適です。それ以上のものを使用する必要がないことを願っています。ただし、「置換」機能を使用して移行を無効にすると、予想される動作が非常に重要になります。
「どのマイグレーションが実行されたかを Django はどうやって知るのですか?」という質問への回答の一部として、適用されたマイグレーションの記録をデータベースに保存します!
データベースに保存されているものをのぞき見したい場合は、Django シェルを使用して以下を見てください。
from django.db.migrations.recorder import MigrationRecorder
[(m.app, m.name) for m in MigrationRecorder.Migration.objects.all()]
単純なケースでは、これは で示されているものと 1 対 1 で直接対応する必要がありますshowmigrations
。ただし、一部の移行を押しつぶした (一部の移行を別の移行に置き換えた) ため、Django はデータベースに保存されている移行とディスクに保存されている移行を比較し、そのプロセスが非常に簡単でなくなることを知っておく必要があります。
したがって、この回答を「Django はどの移行が実行されたかをどのように知るのですか?」に絞り込むために、このコマンドshowmigrations
は、いくつかの情報ソースを使用する Django の移行解決アルゴリズムの結果を表示します。そのうちの 1 つには、適用された移行のすべてのリテラル名の名前を含むテーブルが含まれます。あるものから別のものへの移行方法については...ソースコードを読んでください。
django1.7 の場合、履歴をデータベースの table に保存しますdjango_migrations
。South は移行をデータベースにも保存し、django admin で移行履歴を表示する機能を有効にすることができます。