venv虚拟环境下如何正确配置PostgreSQL数据库连接?
问题根因
报NoneType错误和venv虚拟环境本身没有直接关联,是三个问题叠加导致的,全局环境能正常运行属于脏环境+特殊触发条件下的偶发现象:
- 数据库访问函数存在硬逻辑错误:
create_engine调用被写在了「数据库不存在」的判断分支内,只要目标库已经创建完成就不会执行engine初始化;且函数没有返回值,外部调用时默认拿到None - 配置读取逻辑写法错误:
python-decouple的AutoConfig没有实例化、也没有固定配置文件搜索路径,虚拟环境下启动工作目录变化时,要么读不到settings.ini配置,要么直接抛变量未定义的错误 - 大概率存在虚拟环境依赖漏装问题:全局环境预装的数据库驱动不会自动同步到venv中
修复方案
1. 修正数据库连接函数逻辑
修改sql_con.py中的acceder_bdd方法,把engine初始化移到分支判断外,增加返回值:
from config import link_bdd from sqlalchemy import create_engine from sqlalchemy_utils import database_exists, create_database def acceder_bdd(): url_bdd = link_bdd if not database_exists(url_bdd): create_database(url_bdd) # 无论库是否存在都初始化engine,函数最终返回engine实例 engine = create_engine(url_bdd, echo=False) return engine
调用该方法时必须接收返回值再做操作,示例:
def create_tables(table_list): engine = acceder_bdd() with engine.connect() as conn: for table in table_list: conn.execute(f"DROP TABLE IF EXISTS {table}") # SQLAlchemy 2.0+ 执行写操作需要手动提交 conn.commit()
2. 修正配置读取逻辑
重写config.py,固定配置文件搜索路径为当前文件所在目录,避免不同运行环境下的路径错乱,同时补全AutoConfig实例化步骤:
import os from decouple import AutoConfig # 固定从config.py所在目录查找settings.ini,不受运行工作目录影响 config = AutoConfig(search_path=os.path.dirname(os.path.abspath(__file__))) link_bdd = config("bdd_link")
3. 校验虚拟环境依赖
激活venv后执行以下命令,安装齐所有依赖,注意PostgreSQL连接必须装对应驱动:
pip install python-decouple sqlalchemy sqlalchemy_utils psycopg2-binary
装完重启运行脚本即可正常创建表。
内容的提问来源于stack exchange,提问作者Adrián Piñero
相关产品推荐
相关产品推荐

