4

最近、既存の Django プロジェクトに South を追加しました。全体に通しました

python manage.py syncdb
python manage.py convert_to_south myapp
python manage.py migrate myapp 0001 --fake

このチケットの最後のコメントに従って処理します(カスタム ユーザー モデルがあるため)。

次に、スキーママイグレーションを行って移行したと思いますか? 完全には覚えていませんが、最終的には と という名前の 2 つの移行ファイルに0001_initial.pyなりましたが0002_initial.py、これは正しくないように思われました。

今日、モデルの 1 つにフィールドを追加して、次のように移行しようとしました。

 $ python manage.py schemamigration myapp --auto
 ? The field 'Photo.main_person' does not have a default specified, yet is NOT NULL.
 ? Since you are adding this field, you MUST specify a default
 ? value to use for existing rows. Would you like to:
 ?  1. Quit now, and add a default to the field in models.py
 ?  2. Specify a one-off value to use for existing columns now
 ? Please select a choice: 2
 ? Please enter Python code for your one-off default value.
 ? The datetime module is available, so you can do e.g. datetime.date.today()

 >>> 1
 + Added field main_person on myapp.Photo
Created 0003_auto__add_field_photo_main_person.py. You can now apply this migration with: ./manage.py migrate myapp

$ python manage.py migrate myapp
Running migrations for myapp:
 - Migrating forwards to 0003_auto__add_field_photo_main_person.
 > myapp:0002_initial
FATAL ERROR - The following SQL query failed: CREATE TABLE "myapp_patient" ("id" serial NOT NULL PRIMARY KEY, "password" varchar(128) NOT NULL, "last_login" timestamp with time zone NOT NULL, "email" varchar(255) NOT NULL UNIQUE, "first_name" varchar(100) NOT NULL, "last_name" varchar(100) NOT NULL, "is_active" boolean NOT NULL, "is_admin" boolean NOT NULL, "is_staff" boolean NOT NULL)
The error was: relation "myapp_patient" already exists

Error in migration: myapp:0002_initial
DatabaseError: relation "myapp_patient" already exists

そのため、移行は作成されました0003_auto__add_field_photo_main_personが、2 回目の移行を通過できなかったようです。2 番目の移行ファイルを削除する必要がありますか? それは最初のものとまったく同じで、問題を引き起こしているようですが、それが良い考えであるかどうかを知るには、私は南部に精通していません.

4

1 に答える 1

9

で 2 番目の移行を作成している必要が--initialあるため、名前は 002_initial.py です。で作成したはずです--auto。その過程で何が起こったのかというと、あなたが--initial. そのため、テーブルmyapp_patientがまだ作成されていないことを期待して、移行ファイルにコマンドを記述しました。

また、今まで 2 番目の移行を実行してはなりません。そうしないと、2 番目の移行を初めて実行しようとしたときにこのエラーが発生する可能性があります。

2 回目の移行が最初の移行とまったく同じである場合は、それを削除できます。

あなたが持っている他のオプションは--fake、2番目の移行です。

2回目の移行を偽装した後、通常の移行を行うだけで機能します

http://agiliq.com/blog/2012/01/south/は南のいくつかの概念を明確にするのに役立つかもしれません:)

于 2013-07-12T13:11:20.810 に答える