web-dev-qa-db-ja.com

Djangoは、どのマイグレーションが実行されたかをどのようにして知るのですか?

Djangoは、移行がまだ適用されているかどうかをどのようにして知るのですか?通常、それは正しく行われますが、それがわからない場合は、トラブルシューティングを開始する場所がわかりません。

32
BostonJohn

DjangoはテーブルDjango_migrationsにレコードを書き込みます。これには、移行が属するアプリ、移行の名前、適用された日付などの情報が含まれます。

31
mipadi

showmigrations コマンドを使用して、マイグレーションのリストを提供できます

$ python manage.py showmigrations

各マイグレーションが適用されるかどうか(マイグレーション名の横の[X]でマークされています)。

~/workspace $ python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial
12
Deano

Djangoには、移行履歴を保持する特別なテーブルDjango_migrationsがあります。

点灯しているビットをさらに掘り下げることに興味がある場合は、データベースに移行を記録する MigrationRecorder class を参照してください。また、ここに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)
7
alecxe

Django1.7の場合、データベース、テーブルDjango_migrationsに履歴を保存します。サウスはまた、移行をデータベースに保存します。Django admin。

4
coldmind

showmigrationsの使用は、基本的なユースケースに最適です。うまくいけば、それ以上のものを使用する必要はありません。ただし、「置換」機能を使用して移行を押しつぶすと、予想される動作が非常に重要になります。

「Django実行された移行をどのように知るのですか?」という質問への回答の一部として、彼らはデータベースに適用された移行の記録を保存します!

データベースに何が格納されているかを確認したい場合は、Django Shellを使用して、次のように調べてください。

from Django.db.migrations.recorder import MigrationRecorder
[(m.app, m.name) for m in MigrationRecorder.Migration.objects.all()]

単純なケースでは、これはshowmigrationsで表示されるものと1対1で直接対応する必要があります。ただし、一部の移行を押しつぶした(一部の移行を他のものに置き換えた)場合、Djangoはデータベースに保存されている移行とディスクに保存されている移行を比較するため、プロセスは非常に簡単ではなくなります。

したがって、「Djangoどのマイグレーションが実行されたかを知るにはどうすればよいですか?」に対するこの回答を洗練するために、コマンドshowmigrationsは、Djangoのマイグレーション解決アルゴリズムのresultを示します。 、いくつかの情報源を使用し、その1つには、適用された移行のすべてのリテラル名の名前を含む表が含まれます。一方から他方への移行方法については、ソースコードをお読みください。

2
AlanSE