django 1.7迁移获取错误“表已存在”


70

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

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

我通过发出以下命令来获取此信息:

python manage.py migrate

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

我在本地环境的本地数据库上运行了此文件,没有任何问题。当我将数据库指向生产环境并在migrate上面运行时,出现此错误。


一个问题-django 1.7是否不应该使用django迁移而不是使用south?
karthikr 2014年

该错误是django迁移错误。
Josh Smeaton 2014年

@karthikr我正在使用django迁移。我在这个问题上使用了南标,因为我认为该社区中的某个人可能知道答案。
2014年

我想我也遇到过类似的问题。如果您运行python manage.py syncdb,然后再运行manage.py migration,则会导致这种情况,因为syncdb还可以创建这些表。推荐的方法是在没有数据库的情况下运行此程序:python manage.py migration <app_name>。然后,如果您想创建超级用户,请执行python manage.py createsuperuser。
KhoPhi 2015年

我也有同样的问题。到目前为止没有任何工作。看来我通过删除迁移目录和数据库文件杀死了一种机制。我以为从头开始删除这些文件是可以的,但显然不是这样。
索伦

Answers:


146

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

python manage.py migrate --fake <appname>

将迁移标记为已运行,而无需实际运行

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

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


^在Django 1.11中工作

1
我希望不会因此而引起任何问题
Ajay Kumar,


9

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

我们在创建的每个应用程序中都创建了migrations文件夹,在这些迁移文件夹中,首先创建了迁移文件(最初创建了0001_initial.py,之后将创建所有与该初始文件有关的其他文件),当我们运行python manage.py时迁移,对于每个APP,如果文件有更改,则将应用迁移文件。在migration命令之后,我们可以看到此运行正在“在终端上应用”。如果迁移文件中有任何问题,我们将在此时使用此错误。就我/我们而言:

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给出的答案也是正确的,我只想在我们用于场景的帮助下简单地解释一下


@elmonkeylp为什么不删除引起问题的整个文件而不是注释其部分?
盖德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.