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