我正在尝试应用迁移,但出现错误:
django.db.utils.OperationalError: (1050, "表 'customers_customer' 已经存在")
我通过发出以下命令得到这个:
python manage.py migrate
我的客户表已经存在,那么我该怎么做才能让迁移知道这一点,而不是出错,并运行我对模型的修改?
我在本地环境中使用本地数据库运行它,没有问题。当我将我的数据库指向生产并在migrate
上面运行时,我得到了这个错误。
我正在尝试应用迁移,但出现错误:
django.db.utils.OperationalError: (1050, "表 'customers_customer' 已经存在")
我通过发出以下命令得到这个:
python manage.py migrate
我的客户表已经存在,那么我该怎么做才能让迁移知道这一点,而不是出错,并运行我对模型的修改?
我在本地环境中使用本地数据库运行它,没有问题。当我将我的数据库指向生产并在migrate
上面运行时,我得到了这个错误。
如果您在数据库中创建了表,则可以运行
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
它实际上python manage.py migrate --fake <appname>
如答案中所述,我们可以通过两种方式解决此问题: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 给出的答案也是正确的,我只是想在我们使用场景的帮助下简要解释一下