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.1
和postgres
测试的; YMMV
【讨论】:
不错的答案!我遇到了同样的问题,你的回答对我帮助很大!谢谢! @AndressaCabistani 不客气,很高兴为您提供帮助 对我不起作用,在第 3 阶段出现错误,说它无法创建另一个主键。【参考方案2】:在我的带有 postgres 的 djago 模型 (django 3.2) 上尝试使用 uuid
和 id
时遇到了同样的问题。
我通过添加“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 转换为整数的主要内容,如果未能解决你的问题,请参考以下文章