【问题标题】:Django, Postgres - column cannot be cast automatically to type integerDjango,Postgres - 列不能自动转换为整数类型
【发布时间】:2016-03-28 12:23:06
【问题描述】:

在我的数据库中,我有列:

currency = models.CharField(max_length=10, blank=True, null=True)

我想将此列从 CharField 更改为 IntegerField。所以在models.py 我改变了这个:

currency = models.IntegerField(blank=True, null=True)

然后我进行了迁移:python manage.py makemigrationspython manage.py migrate。之后它会出现错误:

django.db.utils.ProgrammingError: column "currency" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

之后在 pgAdmin3 控制台中我进行了以下更改:

ALTER TABLE my_table ALTER COLUMN currency TYPE integer USING (currency::integer);

但我还是遇到了那个错误,我试图全部改回来,但错误并没有消失。我必须做些什么来逃避这个错误。谢谢

【问题讨论】:

  • ProgrammingError 通常是直接来自 Postgres 的消息。仔细检查该列现在是否为整数。您是否commit 更改了列类型的事务?
  • 您的货币列中是否已有数据?
  • 不,我没有任何数据

标签: python django postgresql django-models


【解决方案1】:

我认为 django 迁移不执行转换,我查看了 documentation 但我没有找到任何关于列转换的内容。

  • 如果现有数据对您来说不是那么重要,您可以删除该列并创建一个新列

    1. 第一步从您的模型中移除货币并应用迁移
    2. 使用新定义再次添加货币并再次应用迁移
  • 如果您想保留数据,您需要为新列指定一个不同的名称,并将旧列用作临时列以在转换期间保存数据。

重要提示: Postgresql 在最新版本中的类型更强,正如here 所解释的那样,某些转换可能在 PosgreSQL 中不起作用,除非它明确完成。它需要更具体地说明类型。所以你必须根据你的价值观做出正确的choice

alter table my_table alter column currency type bigint using currency::bigint

或者也许:

alter table my_table alter column currency type numeric(10,0) using currency::numeric

【讨论】:

  • 我猜这与 Django 和迁移无关,而与 PostgreSQL 无关 - 前段时间我在整数 -> 布尔转换时遇到了类似的问题。在 SQLite 上运行的东西不想在 PostgreSQL 上运行。
【解决方案2】:

从某些数据类型更改为其他数据类型时,这是一个 PSQL 问题...我遇到了类似的问题,我做了一些有点骇人听闻的事情,但它确实有效...但只是因为我在专栏

1) 删除该应用的最新迁移 2)删除/注释掉对象上的“列” 3)迁移缺少列的应用程序 4)恢复/取消注释有问题的“列” 5) 再次迁移

这是在不使用 sql 的情况下删除和重新创建实际数据库上的列的很长的路......我想我会分享一下,以防它可能对未来的人有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2014-02-11
    • 2017-10-23
    • 2015-10-12
    • 2017-04-30
    • 2015-07-26
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多