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

0md85ypi  于 2022-11-13  发布在  Go
关注(0)|答案(5)|浏览(154)

我试着把我的网页上传到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)])

有人知道怎么修吗

vdgimpew

vdgimpew1#

正如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
nukf8bse

nukf8bse2#

几个小时后,我用一个非常容易和简单的方法解决了这个问题

仅删除迁移目录中的所有迁移文件

由于将BigInt转换为UUID是一个问题,所以首先不要生成BigInt,这样创建UUID就不会有任何问题;)

2w2cym1i

2w2cym1i3#

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

示例

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

gstyhher4#

当我尝试在我的djago模型(django 3.2)上使用uuid作为id与postgres时,我遇到了同样的问题。
我通过添加“max_length=36“来解决这个问题--这将限制字段的长度。
相关问答:Link

uelo1irk

uelo1irk5#

我遇到了同样的问题,通过简单地手动更改表中id列的类型,用bigint替换in,我希望它对本主题涉及的人有用。

相关问题