web-dev-qa-db-ja.com

django 1.7移行で「テーブルが既に存在します」というエラーが発生する

移行を適用しようとしていますが、エラーが発生しています:

Django.db.utils.OperationalError:(1050、「テーブル 'customers_customer'はすでに存在します」)

これを取得するには、次のコマンドを発行します。

python manage.py migrate

私の顧客テーブルはすでに存在するので、エラーではなく、移行にこれを知らせ、モデルに変更を実行するにはどうすればよいですか?

ローカルデータベースを使用してローカル環境で問題なく実行しました。このエラーが発生するのは、データベースを実稼働環境に向けてmigrateを実行したときです。

56
Atma

データベースにテーブルが作成されている場合、次を実行できます。

python manage.py migrate --fake <appname>

移行を実際に実行せずに実行済みとしてマークする

または、移行で何らかのアクションを回避したい場合は、app/migrationsディレクトリの下の移行ファイルを編集し、移行実行で実行したくない操作をコメントすることができます。

ドキュメント: https://docs.djangoproject.com/en/1.8/topics/migrations/#upgrading-from-south またはpython manage.py help migrate

116
elmonkeylp

実際にはpython manage.py migrate --fake <appname>

14
Waqas Javed

回答で述べたように、この問題は2つの方法で解決できます。1)移行ファイルで編集する

作成する各アプリケーションに移行フォルダーが作成され、それらの移行フォルダーに移行ファイル(0001_initial.pyが最初に作成され、この初期ファイルに依存する他のすべてのファイルが作成されます)、python manage.py migrate、ファイルに変更がある場合、すべてのAPPに移行ファイルが適用されます。 migrateコマンドの後、ターミナルでApplyingを実行することがわかります。移行ファイルに問題がある場合は、その時点でエラーを取得するために使用します。私の場合:

Applying ValetUser.0002_keyroundslots_systemparameters_vehicleparking_vehicleparkingdetails...Traceback (most recent call last):
sqlite3.OperationalError: table "valet_keyroundslots" already exists

ここで、問題のあるファイル、つまりValetUser.0002_keyroundslots_systemparametersが言及されていることに気付くことができます。したがって、アプリに移動してから移行し、0002ファイルで、問題に直面している特定のモデルのCreateModel操作をコメントできます移行を適用します。例:

operations = [
    # migrations.CreateModel(
    #     name='KeyRoundSlots',
    #     fields=[
    #         ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
    #         ('key_round', models.IntegerField()),
    #         ('key_slot', models.IntegerField()),
    #         ('is_available', models.BooleanField()),
    #         ('Valet_id', models.ForeignKey(blank=True, null=True, on_delete=Django.db.models.deletion.CASCADE, related_name='valet_location', to='ValetUser.ValetAt')),
    #     ],
    #     options={
    #         'db_table': 'valet_keyroundslots',
    #     },
    # ),

2.)エラー/問題に直面している特定のAPPの変更された移行ファイルの偽の移行を適用することにより、-fakeはモデルの既に適用された移行に影響しない偽の移行を適用します。

python manage.py migrate --fake <appname>

Waqasとelmonkeylpの回答も正しいです。シナリオに使用して、簡単に説明したいだけです。

3
Vinay Kumar