1. ホーム
  2. django

Django 1.8: 既存スキーマの初期マイグレーションを作成する

2023-11-14 16:05:31

質問

django 1.8 プロジェクトを開始しました。このプロジェクトでは migrations システムを使用しています。

どういうわけか、途中で物事が面倒になったので、私は DB から migrations フォルダとテーブルを消去し、そして今、それらを再構築しようとしていますが、成功しません。

私は 3 つのアプリ (3 models.py ファイル) があり、モデルにはテーブルが正確に反映されています!

今まで見つけた中で一番良い方法は

  1. すべてを消去する migrations フォルダーを削除します。完了!
  2. からすべてを削除します。 django_migrations テーブルを削除します。完了!
  3. 実行する python manage.py makemigrations --empty <app> をすべてのアプリに対して実行します。完了!
  4. 実行 python manage.py migrate --fake . 完了しました。(ただし、すべての makemigrations コマンドの後に実行した場合のみ動作します。

ここで、新しいフィールドを追加して makemigrations コマンドを実行すると、次のようなエラーが表示されます。

django.db.utils.OperationalError: (1054, "Unknown column 'accounts_plan.max_item_size' in 'field list'")

私はこのことに何時間も費やしてきました。 毎回マイグレーションを中断することなく作業を続けられるように、マイグレーションを初期化するには一体どうしたらいいのでしょうか?

なぜこんなに複雑なのでしょうか?なぜシンプルなワンライナーがないのでしょう。 initiate_migrations_from_schema ?

EDITです。

これでさらに厄介なことになりました。私が切り捨てたのは django_migrations テーブルを切り捨て、すべての migrations フォルダーを削除しました。

ここで、私は実行しようとする python manage.py migrate --fake-initial (DEV docs で見つけたもの) を実行してみると、Django のすべての「内部」アプリ (認証、セッションなど) をセットアップするようになりますが、こうなります。

(1054, "Unknown column 'name' in 'django_content_type'") .

さて、このquot;column"は本当のcolumnではありません。これは @property で定義されたもので、Django の contenttypes のアプリになります。はどうなっているのでしょう?なぜ name プロパティを実際のカラムとして識別しているのでしょうか?

どのように解決するには?

ようやく、原因はわからないが、動くようになったので、今後に期待したい。

何度も試行錯誤を繰り返し、Djangoの開発サイト( リンク ).

以下はその手順です(この問題に遭遇した人のために)。

  1. を空にします。 django_migrations テーブルを delete from django_migrations;
  2. すべてのアプリについて、その migrations フォルダーを削除します。 rm -rf <app>/migrations/
  3. "組み込み"アプリのマイグレーションをリセットします。 python manage.py migrate --fake
  4. 各アプリの実行に対して python manage.py makemigrations <app> . 依存関係に注意する(ForeignKeyを持つモデルは親モデルの後に実行されるべき)。
  5. 最後に python manage.py migrate --fake-initial

その後、最後のコマンドを実行すると --fake-initial フラグなしで実行しました。

これですべてがうまくいき、マイグレーションシステムを普通に使うことができるようになりました。

この問題に遭遇しているのは私だけではないでしょう。よりよく文書化され、さらに単純化される必要があります。

Django 1.9 ユーザのためのアップデートです。

Django 1.9.4 で再びこのシナリオを実行したところ、ステップ 5 が失敗しました。

私がしなければならなかったのは --fake-initial--fake を追加することで動作させることができます。