django.db.utils.ProgrammingError:无法将类型 uuid 转换为整数

Posted

技术标签:

【中文标题】django.db.utils.ProgrammingError:无法将类型 uuid 转换为整数【英文标题】:django.db.utils.ProgrammingError: cannot cast type uuid to integer 【发布时间】:2020-08-11 07:36:24 【问题描述】:

我尝试将我的网站上传到 Heroku 服务器,但遇到了这个问题

我尝试迁移数据库时的错误

上述异常是以下异常的直接原因:

    return self.cursor.execute(sql, params)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: cannot cast type uuid to integer
LINE 1: ...ict_word" ALTER COLUMN "id" TYPE integer USING "id"::integer
                                                              ^

models.py

class Word(models.Model):
    id = models.UUIDField(primary_key=True, unique=True)
    esearch = models.TextField()
    eentry = models.TextField()
    tentry = models.TextField()
    ecat = models.TextField()
    ethai = models.TextField(null=True)
    esyn = models.TextField(null=True)
    eant = models.TextField(null=True)

    def __str__(self):
        return self.eentry

    def get_absolute_url(self):
        return reverse('word-detail', args=[str(self.id)])

有人知道怎么解决吗

【问题讨论】:

【参考方案1】:

正如this answer中指出的:

“更好的方法通常是添加一个 uuid 列,然后修复任何指向它的外键引用,最后删除原始列。”

因此,要在 django 中处理此问题,请执行以下操作:

1) 将迁移恢复为工作图

2)temp_id = models.UUIDField(default=uuid.uuid4) 添加到您的模型中,然后运行 ​​makemigrations

3) * 将 primary_key=True 添加到 temp_id 字段,然后运行 ​​makemigrations再次

4) 将该字段重命名为 id(或任何您想要的名称),然后第三次运行 makemigrations

5) 通过 python3 manage.py migrate

将迁移推送到数据库

*此示例假定您正在更改的模型中没有数据。如果这样做,则必须在第 3 步中添加 custom migration

注意这是使用django 3.1postgres 测试的; YMMV

【讨论】:

不错的答案!我遇到了同样的问题,你的回答对我帮助很大!谢谢! @AndressaCabistani 不客气,很高兴为您提供帮助 对我不起作用,在第 3 阶段出现错误,说它无法创建另一个主键。【参考方案2】:

在我的带有 postgres 的 djago 模型 (django 3.2) 上尝试使用 uuidid 时遇到了同样的问题。

我通过添加“max_length=36”解决了这个问题——这将限制字段的长度。

相关问答:Link

【讨论】:

没有为我解决这个问题,但这个页面对我帮助很大!所以谢谢【参考方案3】:

我认为您应该将默认值定义为 UUID 生成器。

示例

id=models.UUIDField(primary_key=True,default=uuid.uuid4,unique=True)

【讨论】:

【参考方案4】:

几个小时后,我解决了问题 用一个非常简单的方法 根据这篇帖子https://***.com/a/69315948/9272467

只需删除迁移目录中的所有迁移文件 由于将 BigInt 转换为 UUID 是个问题,所以首先不要制作 BigInt,创建 UUID 不会有任何问题;)

【讨论】:

以上是关于django.db.utils.ProgrammingError:无法将类型 uuid 转换为整数的主要内容,如果未能解决你的问题,请参考以下文章