81

我正在尝试应用迁移,但出现错误:

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

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

python manage.py migrate

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

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

4

3 回答 3

172

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

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

于 2014-09-19T02:17:50.100 回答
21

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

于 2015-04-24T08:20:12.270 回答
10

如答案中所述,我们可以通过两种方式解决此问题: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 给出的答案也是正确的,我只是想在我们使用场景的帮助下简要解释一下

于 2018-08-08T09:41:13.007 回答