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

时间:2014-09-19 01:14:00

标签: django django-south django-1.7 django-migrations

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

  

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

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

python manage.py migrate

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

我在本地环境中使用本地数据库运行此操作没有问题。当我将数据库指向生产并在上面运行migrate时,我收到此错误。

3 个答案:

答案 0 :(得分:109)

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

python manage.py migrate --fake <appname>

将迁移标记为在没有实际运行的情况下运行

或者,如果您想避免迁移中的某些操作,可以编辑app / migrations目录下的迁移文件,并评论您不希望在迁移执行中执行的操作。

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

答案 1 :(得分:13)

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

答案 2 :(得分:2)

  

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

     

我们在创建的每个应用程序中都创建了Migrations文件夹,   那些迁移文件夹中的迁移文件(0001_initial.py是   最初创建的文件,之后所有与此相关的其他文件   将创建初始文件),当我们运行python manage.py时   迁移,如果有   在文件中更改。我们可以看到此运行在   迁移命令。如果迁移文件中有任何问题,我们将使用   此时的错误。就我/我们而言:

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给出的答案也是正确的,我只是想   在我们用于场景的帮助下简要说明它