Django,Postgres - 列无法自动转换为整数类型

18

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

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的消息。请仔细检查该列是否已更改为整数类型。您是否提交了更改列类型的事务? - Andomar
你的货币列中已经有数据了吗? - ofnowhere
我没有任何数据。 - Zagorodniy Olexiy
3个回答

21

我认为Django迁移不会执行转换,我查看了文档,但没有找到有关列转换的任何信息。

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

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

重要提示:近期版本的PostgreSQL更强类型化,如此处所述,在PosgreSQL中可能无法执行某些转换,除非明确指定。因此,您必须根据值做出正确的选择

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上却无法正常工作。 - m.antkowicz

7
当从某些数据类型更改为其他数据类型时,这是一个PSQL问题...我也遇到了类似的问题,但我做了一些有点hackey的事情,但它起作用了...但只因为该列中没有重要数据。
1)删除该应用程序的最新迁移 2)删除/注释对象上的“column” 3)使用缺少的列迁移应用程序 4)恢复/取消注释冒犯性的“column” 5)再次进行迁移
这是一种长时间删除和重新创建实际数据库中的列而不使用SQL的方法...想与大家分享,以防将来有人需要。

0
类似于@rafirosenberg的回答,我遇到了类似的问题,解决方法是删除迁移文件。我的具体错误是:
"django.db.utils.ProgrammingError: cannot cast type double 
precision to geometry
LINE 1: ...COLUMN "gps" TYPE geometry(POINT,4326) USING 
"gps"::geometry..."

问题是我在初始迁移时将类型设置为FloatField。所以我必须进入文件树中的应用程序,如下所示,删除0001_inital.py和后续的迁移文件。然后,运行python manage.py makemigrationspython manage.py migrate都顺利完成。
- django-project
  - app0
  - app1
    - migrations
      __init__.py
      0001_inital.py
  - django-project

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接