首页 > 解决方案 > 在 Django 2.0 中从 SQLite 迁移到 Postgresql 时 UUID 的一些问题

问题描述

我正在尝试按照此处描述的步骤将我的 Django 2.0.4 项目从 SQLite 迁移到 PostgreSQL 10 ,但我遇到了不同的问题。在项目期间,我将一些 Integer 字段更改为 UUID4 字段。我设法运行python manage.py migrate --run-syncdb手动编辑auto_increment迁移文件进行这种类型的更改(请参阅 id 字段):从

class Migration(migrations.Migration):

    dependencies = [
        ('dumps', '0011_auto_20180608_1714'),
    ]

    operations = [
        migrations.CreateModel(
            name='Report',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('data', models.DateTimeField(auto_now_add=True, verbose_name='Date')),
            ],
        ),
        ...
        ...
        ...

class Migration(migrations.Migration):

    dependencies = [
        ('dumps', '0011_auto_20180608_1714'),
    ]

    operations = [
        migrations.CreateModel(
            name='Report',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='ID')),
                ('data', models.DateTimeField(auto_now_add=True, verbose_name='Date')),
            ],
        ),
        ...
        ...
        ...

接下来,我注释了所有在 uuid 字段上有 AlterTable 的 auto_increment 文件,但是当我运行时,我收到python manage.py loaddata datadump.json以下错误:

django.db.utils.ProgrammingError: Problem installing fixture 'C:\Users\djangoproject\datadump.json': Could not load myApp.Reservation(pk=10d00b08-bf35-469f-b53f-ec28f8b6ecb3): ERROR:  column "reservation_id" is integer type but the expression is uuid type
LINE 1: UPDATE "myApp_reservation" SET "reservation_id" = '066cff3c-4b...

标签: pythondjangopostgresqlsqlite

解决方案


我认为这里的问题是您有旧的迁移,intAutoField()您更改为使用UUIDField().

您可能需要保持该id字段原样(也许将您的迁移反向到进行 swithc 的点),并在您的模型中包含一个名为的新字段(以及 type 列uuid) :uuidReport

class Report(models.Model)

    id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, serialize=False, verbose_name='UUID')
    data = models.DateTimeField(auto_now_add=True, verbose_name='Date')
    ...

然后重新运行数据库迁移......您可能会遇到更多迁移错误,但请大声告诉我,我可以在聊天中建议从那里去哪里。


推荐阅读