2017-09-17 13 views
0

私のデータベース(postgresql)内のテーブルは、feedbackと呼ばれるfeedbackというmodelというDjangoアプリに関連付けられています。Django - データベース内のモデルを更新できません

私はmodels.pyファイル内feedbackモデルの列のカップルを削除してから使用して移行を作成しました:

python manage.py makemigrations feedback 

そして使用して、私のデータベースとそれを「併合」してみました:

python manage.py migrate feedback 

しかし、私はエラーを受け取りました: django.db.utils.ProgrammingError: relation "feedback" already exists

もちろん、それは存在しますが、私が行った変更。 migrationsフォルダには、次のファイルがあります。

__init__.py 
0001_initial.py 
0002_remove_feedback_created_on.py 
0003_remove_feedback_is_read.py 

最後のファイルには、私の最新の変更が含まれています。私は何をすべきか?

+0

万が一のマイグレーションが間違っていましたか? –

+0

はい、「0002」は一度も適用されませんでした。同じエラーが発生しました。私は '0002'と' 0003'を削除しようとしました( '0001'は大丈夫でした)、今は' 0002'で行った変更が残っていますが、 '0002を移行しようとすると同じエラーが出ます'。 – Gambit2007

答えて

1

通常、このrelation x already existsの問題は、データベースのある時点で変更を適用したときに表示されますが、Django移行システムは、あなたが既にそれを行ったという事実について手掛かりを得ていません。それはどうしたらできますか?たとえば、ForeignKeyフィールドをモデルに追加する場合は、マイグレーションを行い、マイグレーションしてから、マイグレーションを削除してからマイグレーションを削除してください。プロジェクトには何も問題はありませんが、データベースの関係とフィールドは残っています(フィールドがnullでない場合、問題が発生する可能性があります)。今度はあなたの心を再び変えてshiiitを決定したら、そのフィールドをanyhowsに追加してもう一度追加し、新しい移行を行い、それを移行しようとすると、relation x already existsエラーが発生します。

[OK]を次に何ですか?通常、最も簡単な方法は失敗した移行を偽造することですが、移行に適用されないその他の変更がある場合は、データベースにも適用されません。BEWARE移行の偽造を開始する前に、何が偽であるのかを理解していることを確認してください。理想的には、マイグレーションファイル内にAddFieldが1つしかないのは間違いありません。そうしないと、マイグレーションファイル内のすべての変更が偽造されるためです(マイグレーションとは、データベースに変更が適用されていないことを意味します。 )。

適用されていない2つの移行がある場合は、移行番号を指定せずにmigrate --fakeを実行しないでください。後者の適用されない移行も適用されません。あなたのケースでは、その後manage.py migrate 0002 --fakemanage.py migrateを実行するとすべてが修正される可能性がありますが、実行したことに関するすべてを知らなくても、確実に言うことは不可能です。

私があなたのプロジェクトを選んだ場合、私は何をするのですか:
1)0002に複数の変更が含まれているかどうかを確認してください。
「はい」の場合は、失敗したフィールド以外のすべてを0003にコピーします。
いいえの場合は、manage.py migrate 0002 --fakeに進みます。
2)もう一度manage.py migrateを実行して0003を移行してください。

0

移行の際にも役立つ可能性があります。

python3 manage。py migrate --run-syncdb

関連する問題