在Django 2.0中从SQLite迁移到Postgresql时出现了一些与UUID相关的问题。

6 浏览
0 Comments

在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...

0
0 Comments

在将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'类型,从而解决了迁移时的问题。

0
0 Comments

在将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上运行的。

0