导入Psycopg2==2.7.4后Django执行migrate报错,服务器无法正常运行
解决Psycopg2 2.7.4导致Django迁移失败的问题
嘿,我之前碰到过类似的情况,你这大概率是Psycopg2 2.7.4和Django版本、PostgreSQL环境不兼容,或者迁移里的新字段触发了老版本驱动的bug。给你几个一步步排查解决的方案:
先搞清楚核心原因
Psycopg2 2.7.4是2018年的老版本了,如果你用的Django是2.x以后的版本,或者PostgreSQL服务器版本比较新(比如10+),很容易出现兼容性冲突——尤其是字段类型映射、迁移语句执行这两块。另外也有可能是安装Psycopg2时依赖没装全,导致驱动工作异常。
具体解决步骤
1. 先核对版本兼容性
先看看你当前的Django和PostgreSQL版本,再对应Psycopg2的兼容要求:
# 查看Django版本 python -m django --version # 查看Psycopg2版本 pip show psycopg2 # 查看PostgreSQL版本(如果能连数据库的话) psql -V
一般来说:
- Django 2.x 适配Psycopg2 2.7.x,但2.7.4可能有小bug,推荐用2.7.7;
- Django 3.x+ 至少需要Psycopg2 2.8.x;
- PostgreSQL 10+ 建议用Psycopg2 2.8及以上版本。
2. 升级Psycopg2到兼容稳定版
这是最直接的解决办法,推荐用预编译的二进制包(安装快,少踩编译坑):
# 升级到兼容大部分场景的2.8.6版本 pip install --upgrade psycopg2-binary==2.8.6 # 如果生产环境需要源码编译(比如有特殊依赖),用这个: pip install --upgrade psycopg2==2.8.6
3. 检查出问题的迁移文件
打开报错的buddysapp/migrations/0038_auto_20180321_0025.py,看看新添加的字段:
- 是不是用了
JSONField、ArrayField这类需要特定Psycopg2版本支持的字段? - 如果是,要么升级Psycopg2,要么临时换成
TextField过渡(等驱动升级后再改回来)。
4. 重置迁移(谨慎操作!先备份数据)
如果迁移文件本身生成有问题,可以尝试重置该应用的迁移:
# 删除出问题的那个迁移文件(保留migrations目录下的__init__.py) rm buddysapp/migrations/0038_auto_20180321_0025.py # 重新生成迁移文件 python manage.py makemigrations # 再次执行迁移 python manage.py migrate
划重点:如果数据库里已经有业务数据,一定要先备份数据库再操作!
5. 检查PostgreSQL依赖
如果升级Psycopg2还是不行,可能是系统缺少PostgreSQL的开发依赖,比如在Ubuntu/Debian上:
sudo apt-get install libpq-dev python-dev
然后重新安装Psycopg2。
内容的提问来源于stack exchange,提问作者Doing Things Occasionally
相关产品推荐
相关产品推荐

