Django部署Heroku执行migrate时报date无法转无时区time类型错误
错误根因
该报错和settings.py中的TIME_ZONE配置没有关联,核心是Heroku默认使用的PostgreSQL数据库不支持date类型到time without time zone类型的直接强制转换:你之前的order表creation_date字段为DateField类型,对应数据库的date格式,本次迁移要将其修改为TimeField类型,对应数据库的time without time zone格式,超出了数据库默认的字段转换能力范围,因此触发报错。
解决方案
根据线上是否已有需要保留的生产数据,可选择对应修复方案:
方案1:线上无有效生产数据(可清空字段内容)
该方案操作成本最低,步骤如下:
- 删除当前触发报错的迁移文件
- 如果你实际需要存储「日期+时间」的完整信息,建议优先将模型字段调整为
DateTimeField(TimeField仅能存储时分秒,不包含日期信息):
creation_date = models.DateTimeField(default=django.utils.timezone.now, verbose_name='Data Ordine')
- 本地重新生成迁移文件:
python manage.py makemigrations - 提交代码推送到Heroku后,重新执行迁移命令即可:
python manage.py migrate
方案2:线上有生产数据不可清空
需要将单次字段类型修改的操作拆分为3个迁移步骤,绕过数据库的类型转换限制:
- 在
order模型中新增临时时间字段,例如temp_creation_time = models.TimeField(default=django.utils.timezone.now, verbose_name='临时时间'),执行python manage.py makemigrations生成第一个迁移文件 - 创建自定义数据迁移,将原有
creation_date字段中需要保留的时间信息同步到新增的临时字段中 - 删除原
creation_date字段,再将temp_creation_time字段重命名为creation_date,执行python manage.py makemigrations生成第三个迁移文件
将三个迁移文件按顺序提交推送到Heroku,依次执行迁移即可解决报错。
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

