【问题标题】:Cannot cast type integer to uuid无法将类型整数转换为 uuid
【发布时间】:2021-01-26 20:47:57
【问题描述】:

我尝试运行python3 manage.py migrate,但我得到了这个错误

  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django /db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: cannot cast type integer to uuid
LINE 1: ...BLE "core_post" ALTER COLUMN "id" TYPE uuid USING "id"::uuid

我正在使用 PostgreSQL

我的models.py: Link to pastebin

希望你能帮助我)

谢谢!

【问题讨论】:

  • 假设该列包含一个数字5,您如何将其转换为uuid
  • @WillemVanOnsem 一个 UUID 是 128 位整数,全零以 5 结尾。但是,这可能会在某些时候与为不同 UUID 类型保留的命名空间发生冲突。
  • @Melvyn:它的表示方式是一个 128 位的数量,是的。但例如,不使用uuid 来表示项目的amount,尤其是因为uuid 应该是一个通用唯一 标识符。 “第一代”编程语言当然没有做出这种区分,但我认为第四代及以后的编程概念可能会拒绝这个想法。
  • @WillemVanOnsem 这里也没有:他正在将主键从序列号更改为 uuid。现在这行不通了,因为 postgres 不允许这样做,因为为特定的 uuid 类型(1 到 5)定义了特定的命名空间,但理论上,这不会是一个问题。不要沉迷于普遍独特的产品。这不能保证,只是不太可能。
  • @Melvyn:会的。因为universally unique意味着它不可能发生碰撞。但是,如果您将两个主键转换为整数,则冲突的可能性是(接近)绝对的。所以这些基本上是两个词,在实际意义上,一个 uuid 表示为一个 128 位数字,但从概念上讲,两个两个是不同的世界。这基本上是第三代提出的:分类法。例如,意义不仅仅是数据:它是具有上下文的数据。

标签: django postgresql django-models django-migrations django-postgresql


【解决方案1】:

因此,基本上您在没有显式主键的情况下启动了模型。所以你有一个免费的 AutoField,现在希望它们成为 UUID。

如您所见,Postgres(或我知道的任何数据库)不允许将整数更改为 UUID。所以你需要做一些迁移来获得你想要的状态:

首先将uuid字段添加为普通字段,名称不同:

import uuid
from django.db import models

class MyModel(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, unique=True)

运行 makemigrations 并迁移。

现在让它成为主键:

class MyModel(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, primary_key=True)

这应该会生成一个移除 id 字段并使 uuid 成为主键的迁移(makemigrations 并再次迁移)。

最后(如果你还想的话):

class MyModel(models.Model):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True)

老实说,我不知道这是否正常,您可能需要调整生成的迁移。无论哪种情况,您现在都应该在您想去的地方。

【讨论】:

  • 嗨,我的模型中有多个对象希望迁移到 uuid,现在当我在第一步中创建“uuid”字段时,唯一的 =True 条件失败,因为我为所有对象获得相同的值。如何遍历对象并为每个对象生成唯一的 uuid id?
  • 找到了解决办法,stackoverflow.com/a/48235821/11524615,可以试试这个!
  • 你是 default=uuid.uuid4() 而不是 default=uuid.uuid4
  • 它非常适合我,谢谢!
猜你喜欢
  • 2020-08-11
  • 2019-02-26
  • 1970-01-01
  • 2023-02-08
  • 2012-12-20
  • 2021-02-27
  • 2012-10-21
  • 1970-01-01
相关资源
最近更新 更多