Django Migrations:CharField与DateTimeField互转迁移报错如何解决?
错误原因
你克隆的生产环境数据库中,order_booking_time 字段当前为CharField类型,已存储了如2021-10-10 10.00这类用点分隔小时与分钟的字符串。待执行的0002_alter_userorder_order_booking_time迁移要将该字段转为DateTimeField,PostgreSQL在做类型转换时无法识别带点的时间格式,触发格式校验报错。
解决方案
根据你的业务需求选择对应方案即可:
- 方案1:保留历史数据,修正格式后迁移
先连接沙箱PostgreSQL数据库,执行SQL修正所有异常时间格式:
格式修正完成后,再执行迁移命令即可:UPDATE pro_auth_userorder SET order_booking_time = REPLACE(order_booking_time, '.', ':') WHERE order_booking_time ~ '^\d{4}-\d{2}-\d{2} \d{2}\.\d{2}$';python manage.py migrate - 方案2:不需要保留该字段历史数据
直接清空字段内容后执行迁移:
再运行UPDATE pro_auth_userorder SET order_booking_time = NULL;python manage.py migrate即可。 - 方案3:已确认最终要把字段改回CharField,无需执行本次转DateTime的中间迁移
直接标记该迁移为已执行,跳过本次操作:
注意:该操作仅适用于当前数据库表结构和迁移预期结构一致的场景,避免后续迁移出现结构不一致问题python manage.py migrate --fake pro_auth 0002
内容的提问来源于stack exchange,提问作者Ankit Chaurasia
相关产品推荐
相关产品推荐

