Django:在这种情况下,我该如何迁移?迁移不起作用

时间:2019-07-05 04:44:17

标签: python django pycharm

首先,现有模型位于“ 0001_initial.py”中。

添加了我添加的“模型”之后,当我进行了“ makemigrations”操作时,它将进入“ 0002_xxx.py”。

我成功完成了迁移,数据库没有问题。

然后添加这些“模型”时,我想将初始数据放入数据库中。

所以我做了一个夹具文件夹,用于在迁移后放入初始数据。

我将json文件放入其中。

但是,当我更改'model'的名称并再次执行'makemigrations'时,我在查找表时遇到了错误。

所以我直接去了sqlite并删除了新模型上的所有表格。

然后我做了移民。

之后,

python3 manage.py migrate sbimage

当我这样在这里“迁移”时,

django.db.utils.OperationalError: table "sbimage_camerathreshold" already exists

有这样的错误。

python3 manage.py migrate sbimage --fake

这使得0001、0002都“假”。

这是我的0002文件是在“ makemigrations”之后创建的。

from django.db import migrations, models

def load_my_initial_data(apps, schema_editor):
    call_command("loaddata", "addition.json")

class Migration(migrations.Migration):

    dependencies = [
        ('sbimage', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='AuthNumberR',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('auth_number_r', models.CharField(max_length=64)),
            ],
        ),
        migrations.CreateModel(
            name='AuthNumberT',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('auth_number_t', models.CharField(max_length=64)),
            ],
        ),
        migrations.CreateModel(
            name='Claimant',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('claimant', models.CharField(max_length=64)),
            ],
        ),
        migrations.CreateModel(
            name='CountryOfOrigin',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('country_of_origin', models.CharField(max_length=64)),
            ],
        ),
        migrations.CreateModel(
            name='EquipmentName',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('equipment_name', models.CharField(max_length=64)),
            ],
        ),
        migrations.CreateModel(
            name='FccId',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('fcc_id', models.CharField(max_length=64)),
            ],
        ),
        migrations.CreateModel(
            name='Manufacturer',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('manufacturer', models.CharField(max_length=64)),
            ],
        ),
        migrations.CreateModel(
            name='NbId',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('nb_id', models.CharField(max_length=64)),
            ],
        ),
        migrations.CreateModel(
            name='Publisher',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('publisher', models.CharField(max_length=64)),
            ],
        ),
        migrations.CreateModel(
            name='WarningStateList',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('warning', models.CharField(max_length=4096)),
            ],
        ),
        migrations.CreateModel(
            name='WifiWarningStateList',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('wifi_warning', models.CharField(max_length=4096)),
            ],
        ),
        migrations.RunPython(load_my_initial_data),
    ]

在这种情况下如何创建新创建的模型表?

  • 此代码根本无效。

    python3 manage.py迁移sbimage 0002

    正在运行的迁移:  没有要应用的迁移。

2 个答案:

答案 0 :(得分:0)

理想情况下,永远不要直接从数据库中删除表。

您可以使用migration命令还原数据库。

./manage.py migrate my_app 00xx_migration_file_you_want_to_revert_to.py

现在,删除所有迁移文件,然后重新运行makemigrationmigrate命令。

答案 1 :(得分:0)

在对数据库使用代码优先方法时,切勿尝试直接操作数据库。 就您所关心的问题而言,您的迁移没有应用,因为迁移总是按顺序进行。 假设您已经迁移了6个迁移,然后创建了第7个迁移,那么该迁移将检查以前的迁移是否与数据库同步。在您的情况下,直接对数据库进行硬编码会导致模型出现差异。最省事的方法将涉及您

  1. 从django应用程序中删除迁移文件夹。
  2. 从数据库中的迁移表中删除所有数据。
  3. python manage.py makemigrations
  4. python manage.py migration --fake

之后,您可以重新应用迁移以将模型同步到数据库。