Django,Postgres - 列不能自动转换为整数类型

时间:2015-12-22 09:27:29

标签: python django postgresql django-models

在我的数据库中,我有专栏:

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);

但是我仍然遇到了这个错误,我试图改变所有错误,但错误并没有消失。我必须做什么来逃避这个错误。谢谢

2 个答案:

答案 0 :(得分:8)

我认为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

答案 1 :(得分:1)

从某些数据类型转换为其他数据时,这是一个PSQL问题...我遇到了类似的问题,我做了一些有点hackey的事情,但它有效......但仅仅因为我没有任何重要数据柱

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

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