升级PostgreSQL 11至16后Django触发ProgrammingError报错求助
问题分析
从报错堆栈可明确:Django初始化阶段(数据库表尚未创建),代码就执行了模块级别的数据库查询,具体是main/utils/specific_instance.py中直接运行了:
comp = Customers.objects.get(pk='8aefa7c0-e72e-4b78-83d8-34cdb3e3ab98')
此时account_lib_customers表还未通过迁移创建,因此抛出"relation不存在"的错误。开头的RuntimeWarning也明确提示:Accessing the database during app initialization is discouraged,这正是问题根源。
解决方案
1. 修复模块级查询
将模块导入时自动执行的数据库查询改为延迟加载,比如:
- 封装到函数内部,仅在实际需要时调用
- 若需全局实例,使用懒加载逻辑或Django信号延迟执行
示例修改:
# main/utils/specific_instance.py def get_default_customer(): return Customers.objects.get(pk='8aefa7c0-e72e-4b78-83d8-34cdb3e3ab98') # 原代码中调用comp的位置,替换为调用该函数 # comp = get_default_customer()
2. 重新初始化数据库流程
修复代码后,按以下步骤执行:
- 确保PostgreSQL 16容器正常启动
- 执行
python manage.py makemigrations生成所有应用(含account_lib)的迁移文件 - 执行
python manage.py migrate创建全部数据库表 - 启动
runserver
关于account_lib的操作说明
需要针对account_lib做对应处理:
- 若account_lib是Django应用(包含models和migrations),需确保它在
INSTALLED_APPS配置中,执行迁移命令时会自动创建其对应的表结构 - 若account_lib是纯数据库库(无Django模型),需手动在PostgreSQL中创建
account_lib_customers表结构,或导入该库的初始化SQL脚本
内容的提问来源于stack exchange,提问作者jordan
相关产品推荐
相关产品推荐

