django 1.7 migrate获取错误"表已经存在"

Atm*_*tma 59 django django-south django-1.7 django-migrations

我正在尝试应用迁移,但我收到错误:

django.db.utils.OperationalError:(1050,"表'customers_customer'已经存在")

我通过发出以下命令得到这个:

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

我的客户表已经存在,那么我该如何让迁移知道这一点,而不是出错,并对我的模型进行修改?

我在本地环境中用本地数据库运行它没有问题.当我将数据库指向生产并在migrate上面运行时,我得到了这个错误.

elm*_*ylp 120

如果您在数据库中创建了表,则可以运行

python manage.py migrate --fake <appname>
Run Code Online (Sandbox Code Playgroud)

将迁移标记为运行而不实际运行它们

或者,如果要避免迁移中的某些操作,可以编辑app/migrations目录下的迁移文件,并在迁移执行中注释您不想执行的操作.

文件:https://docs.djangoproject.com/en/1.8/topics/migrations/#upgrading-from-southpython manage.py help migrate

  • 该命令实际上是python manage.py migrate --fake <app> (7认同)
  • 我希望不会因此出现问题 (2认同)

Waq*_*ved 15

它实际上 python manage.py migrate --fake <appname>


Vin*_*mar 9

我们可以通过回答中提到的两种方式解决这个问题:1.) 通过在迁移文件中编辑

我们在创建的每个应用程序中都创建了迁移文件夹,在这些迁移文件夹中,迁移文件(0001_initial.py 是最初创建的,之后将创建依赖于该初始文件的所有其他文件),当我们运行 python manage.py迁移,对于每个应用程序,如果文件中有更改,则迁移文件将适用。我们可以在 migrate 命令之后在终端上看到这个运行 Applying。如果迁移文件中存在任何问题,我们会在此时获取错误。在我/我们的情况下:

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

在这里我们可以注意到我们有问题的文件被提到,即 ValetUser.0002_keyroundslots_systemparameters,所以我们可以转到应用程序然后迁移,在 0002 文件中我们可以评论我们面临问题的那个特定模型的创建模型操作应用迁移。例子:

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',
    #     },
    # ),
Run Code Online (Sandbox Code Playgroud)

2.) 通过对我们面临错误/问题的特定 APP 的修改迁移文件应用假迁移,--fake 将应用不会影响模型已应用迁移的假迁移。

python manage.py migrate --fake <appname>
Run Code Online (Sandbox Code Playgroud)

Waqas 和 elmonkeylp 给出的答案也是对的,我只是想借助我们习惯的场景简单解释一下