在Django 2.0中从SQLite迁移到Postgresql时出现了一些与UUID相关的问题。
在Django 2.0中从SQLite迁移到Postgresql时出现了一些与UUID相关的问题。
我正在尝试将我的Django 2.0.4项目从SQLite迁移到PostgreSQL 10,按照这里所描述的步骤进行操作,但是我遇到了一些问题。
在项目中,我将一些整数字段更改为UUID4字段。
我成功运行了python manage.py migrate --run-syncdb
,手动编辑了自动递增迁移文件,并进行了以下更改(请参见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的自动递增文件,但是当我运行python manage.py loaddata datadump.json
时,我得到了以下错误:
django.db.utils.ProgrammingError: 安装夹具'C:\Users\djangoproject\datadump.json'时出现问题:无法加载myApp.Reservation(pk=10d00b08-bf35-469f-b53f-ec28f8b6ecb3):ERROR:列"reservation_id"是整数类型,但表达式是uuid类型 LINE 1: UPDATE "myApp_reservation" SET "reservation_id" = '066cff3c-4b...
在将SQLite迁移到Django 2.0中的PostgreSQL时,遇到了一些与UUID相关的问题。问题的出现原因是在PostgreSQL的表结构中,'id'字段的类型是'integer'而不是'uuid'。解决方法是将其转换为'uuid'类型,然后成功导入了数据。
代码如下:
# 定义模型 from django.db import models import uuid class MyModel(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # 其他字段... # 迁移数据库 python manage.py makemigrations python manage.py migrate
这样,通过在模型中使用`UUIDField`字段类型,并将`primary_key`设置为`True`,可以将'integer'类型的'id'字段转换为'uuid'类型,从而解决了迁移时的问题。
在将SQLite迁移到PostgreSQL时,使用Django 2.0遇到了一些UUID相关的问题。问题的原因是在将int
类型的主键字段列更改为UUIDField()
之前,旧的迁移文件中引用了AutoField()
。解决方法是在Report
模型中保留id
字段不变,同时添加一个新的字段(类型为uuid
)并命名为uuid
:
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') ...
然后重新运行数据库迁移,可能会遇到其他迁移错误,但可以在聊天中请求帮助。
然而,由于项目已经处于生产环境中,无法像这样轻易地进行更改。如果添加uuid
字段,是否可以删除id
字段并将uuid
重命名为id
,然后再运行python manage makemigrations/migrate
命令呢?
不幸的是,不能这样轻易地更改。因为已经将id存储为整数。这个问题没有官方解决方案,这让人感到很奇怪。我建议你按照我的建议添加所需的额外字段,并相应地更新代码库。你的视图和URL中是否依赖于这个id字段?
是的,我在视图文件中使用它作为href链接。我会尝试按照你的建议去做,但是我对于没有更便宜的解决方案感到非常惊讶。
你提出的解决方法似乎不起作用,因为如我所说,项目已经开始,并且在项目进行到一半时,将id = models.AlterField(...)
更改为id = models.UUIDField
。因此,如果按照你的指示编辑我的'Report'类,我会遇到django.db.utils.IntegrityError: datatype mismatch
错误。
你需要在uuid字段中添加blank=True
,并回填旧的条目。
让我们在聊天中继续讨论。
出错了,仍然是同样的错误:django.db.utils.IntegrityError: datatype mismatch
。
你的列名是什么?我觉得你可能是在损坏的数据库上实施了我的解决方案...请恢复到在手动更改迁移文件之前的状态。
我将项目恢复到最后一个工作版本的SQLite数据库上。我将每个迁移文件恢复到其原始版本,只是按照你的建议编辑了模型,并运行了python manage.py makemigrations
/ python manage.py migrate
命令。当我运行迁移命令时出现了错误。
你是添加了uuid
字段还是替换了id
字段为uuid
?
我按照你的建议添加了uuid字段: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', blank=True)
。
我不明白的是,为什么在SQLite中以及将uuid字段命名为'id'的情况下,一切都能正常工作,但是迁移到PostgreSQL时却失败了。实际上,整个项目都是在SQLite上运行的。