web-dev-qa-db-ja.com

Djangoマイグレーションを実行した後でもプログラミングエラー列は存在しません

走る python manage.py makemigrationsが表示されます:変更が検出されなかった場合、python manage.py migrateと私は得ます:適用する移行はありません。

次に、本番環境に変更をプッシュしようとします:git Push heroku master Everything to-to-date

次に、実稼働環境で次のコマンドを繰り返します。heroku run python manage.py migrate適用する移行はありません。

念のため、本番環境でmakemigrationsを実行します。

heroku run python manage.py makemigrations
No changes detected

なぜそれから私は

ProgrammingError at ....

column .... does not exist

「変更は検出されません」とは、データベースがコードと一貫していることを意味します。これをデバッグするにはどうすればよいですか?

12

Djangoの移行は、データベースの「Django_migrations」テーブルの下に記録されます。 Django=は、どのマイグレーションが適用され、どのマイグレーションがまだ適用される必要があるかを知る方法です。

DBのDjango_migrationsテーブルをご覧ください。移行が適用されたときに問題が発生した可能性があります。そのため、「存在しない」列に関連する移行ファイル名を持つテーブルの行を削除します。その後、移行を再実行してください。

8
zubhav

同じ問題が発生しました(列が存在しません)が、migrateではなくmakemigrationsを実行しようとすると(同じ問題だと思います)

  • 原因:移行ファイルを削除し、最後の変更の移行を実行する前に、単一のふりをした初期移行ファイル0001に置き換えました

  • 解決:

    1. そのアプリのその移行に関係するテーブルを削除します(バックアップの回避策がある場合は検討してください)
    2. そのアプリの移行を担当する行をテーブルから削除しますDjango_migrations移行が記録されます。これがDjangoがどの移行が適用され、まだ適用される必要があるかを知る方法です。

そして、この問題を解決する方法は次のとおりです。

  • postgresユーザーとしてログインします(私のユーザーはposgresと呼ばれます):

    Sudo -i -u postgres

  • SQLターミナルを開き、データベースに接続します。

    psql -d database_name

  • テーブルをリストし、そのアプリに関連するテーブルを見つけます。

    \dt

  • それらをドロップします(リレーションのドロップ順を考慮してください):

    DROP TABLE tablename ;

  • 移行レコードを一覧表示すると、次のように分類されて適用された移行が表示されます。

id |アプリ|名前|適用された
-+ ------ + -------- + --------- +

SELECT * FROM Django_migrations;
  • そのアプリの移行の行を削除します(IDまたはアプリごとに削除できますが、アプリは「引用符」を忘れないでください):

    DELETE FROM Django_migrations WHERE app='yourapp';

  • ログアウトして移行を実行するだけです(場合によってはmakemigrationsを実行することもできます)。

    python manage.py migrate --settings=your.settings.module_if_any

注:場合によっては、すべての移行ではなく、そのアプリのすべてのテーブルを削除する必要はなく、問題の原因となっているモデルのみを削除する必要があります。

これが役立つことを願っています。

11
Yahya Yahyaoui

同様の問題がありました-Django-adminサイトでモデルをクリックすると、エラーメッセージが表示されました。 models.pyのフィールドをコメントアウトし、移行を実行することで解決しました。これに続いて、フィールドのコメントを外し、移行を再実行しました。その後、エラーメッセージが消えました。

3
GraceBe