Django 4.1从SQLite迁移至PostgreSQL时Boolean字段迁移报错
解决Django 4.1从SQLite切换PostgreSQL迁移报错问题
问题根源
SQLite中BooleanField实际以integer(0/1)存储,但PostgreSQL对类型转换有严格限制,自动生成的迁移脚本直接尝试将smallint转为boolean会触发语法错误;修改字段类型后,旧迁移记录的冲突会导致sessions、contenttype等依赖表无法正常迁移。
具体解决步骤
1. 清理冲突迁移记录
- 删除目标应用
migrations目录下除__init__.py外的所有迁移文件 - 清空PostgreSQL数据库中的
django_migrations表,执行SQL语句:TRUNCATE TABLE django_migrations;
2. 确认模型字段定义
确保Item模型的isProduct字段定义正确:
from django.db import models class Item(models.Model): isProduct = models.BooleanField(default=True) # 其他字段定义...
3. 生成适配PostgreSQL的新迁移
在项目根目录执行命令:
python manage.py makemigrations
此操作会生成全新的、适配PostgreSQL的迁移脚本,避免类型强制转换的问题。
4. 执行迁移操作
先标记核心系统表已完成初始迁移,再执行全量迁移:
python manage.py migrate --fake-initial python manage.py migrate
--fake-initial参数会跳过sessions、contenttype等系统表的初始迁移检查,避免依赖阻塞。
5. 存量数据迁移(如有需要)
若SQLite中有需要迁移的数据,先导出为JSON格式:
python manage.py dumpdata > data.json
切换到PostgreSQL环境后导入数据:
python manage.py loaddata data.json
PostgreSQL会自动将原数据中的0/1转换为布尔值(False/True)。
注意事项
- 不同数据库类型的迁移脚本无法直接复用,需针对目标数据库重新生成
- 开发阶段尽量保持数据库环境一致,减少跨数据库适配成本
内容的提问来源于stack exchange,提问作者limitededition
相关产品推荐
相关产品推荐

