【问题标题】:Django:In this situation, how can I migrate? migrate is not workingDjango:在这种情况下,我该如何迁移?迁移不起作用
【发布时间】:2019-11-15 17:04:26
【问题描述】:

首先,现有模型在'0001_initial.py'中。

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

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

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

所以我制作了fixture文件夹,用于在进行迁移后放入初始数据。

我把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

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

【问题讨论】:

  • 清除所有迁移并重试

标签: python django pycharm


【解决方案1】:

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

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

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

【讨论】:

  • 我应该删除 django_migrations 表吗?或 DELETE FROM django_migrations WHERE app = 'sbimage';用这个代码就可以了吗?
  • @JunhyunKyung DELETE FROM django_migrations WHERE app = 'sbimage';工作得很好。
  • 我按这个顺序试过了,但是没有生成表格。 python3 manage.py loaddata addition.json 错误信息:没有这样的表:sbimage_warningstatelist
  • 我看不到您的数据库,因此无法真正找到此问题的根本原因,您需要确保代码中的所有模型/字段具有与表/字段相同的属性/名称数据库。此外,作为第 4 步的替代方法,您可以运行 python manage.py migrate --run-syncdb
  • python3 manage.py migrate sbimage --run-syncdb CommandError: Can't use run_syncdb with app 'sbimage' 因为它有迁移。迁移不起作用。
【解决方案2】:

理想情况下,您不应该直接从数据库中删除表。

您可以使用migration 命令恢复数据库。

./manage.py migrate my_app 00xx_migration_file_you_want_to_revert_to.py

现在,删除所有迁移文件并重新运行makemigration 和migrate 命令。

【讨论】:

  • 请注意:您无需输入全名,您只需输入号码00xx。此外,您可以使用migrate app zero 取消迁移整个应用程序
猜你喜欢
  • 2018-06-12
  • 2019-07-29
  • 2021-07-15
  • 1970-01-01
  • 2019-06-25
  • 2012-09-08
  • 1970-01-01
  • 2015-04-29
  • 2013-06-03
相关资源
最近更新 更多