Python 栏「;日期“;无法自动强制转换为使用时区django/postgres键入时间戳

Python 栏「;日期“;无法自动强制转换为使用时区django/postgres键入时间戳,python,django,postgresql,date,Python,Django,Postgresql,Date,当我以前将日期保存为字符串时,有一个datecharfield。但现在我将字段从charfield更改为datetimefield,并删除了所有以前的数据 date = models.DateTimeField(default=timezone.now) 在本地,它工作正常,但在生产环境中,尝试迁移时会出现以下错误。我删除了列、模型、注释和取消注释、删除并再次创建字段、返回到以前的迁移并再次迁移,但所有这些都没有帮助 django.db.utils.ProgrammingError:

当我以前将日期保存为字符串时,有一个
date
charfield。但现在我将字段从charfield更改为datetimefield,并删除了所有以前的数据

date = models.DateTimeField(default=timezone.now)
在本地,它工作正常,但在生产环境中,尝试迁移时会出现以下错误。我删除了列、模型、注释和取消注释、删除并再次创建字段、返回到以前的迁移并再次迁移,但所有这些都没有帮助

    django.db.utils.ProgrammingError: column "date" cannot be cast automatically to type timestamp with time zone
HINT:  You might need to specify "USING date::timestamp with time zone".

如何正确地解决这个问题?使用django 1.8、python 2.7和postgres

在postgres shell中运行:

ALTER TABLE table_name ALTER COLUMN col_name TYPE timestamp with time zone USING col_name::timestamp with time zone

如果您在Google上试图将整数列转换为时间戳时发现此问题,请执行以下操作:

ALTER TABLE my_table
ALTER COLUMN my_column
TYPE timestamp with time zone
USING to_timestamp(my_column);

如果您的列不能完全从原始类型转换为新类型,请考虑放弃旧列并创建一个新列:

  • 注释掉模型中的列字段
  • makemigration(将为此字段生成删除迁移)->您将删除所有列数据
  • migrate在模型中保留注释再次运行makemigration(现在将生成一个新的migration,其中new列包含new 数据类型)
  • 再次运行“迁移”以应用更改

如果您只有很少的字段,这很好,但是如果您有许多字段要转换,我建议您为此编写一个特定的数据迁移

是否有任何不中断的数据库解决方案?它会导致任何问题吗?如果您的列到目前为止是完全可转换的,并且没有任何无效数据,则不会发生任何问题