代码中设置SQLALCHEMY_SILENCE_UBER_WARNING无法屏蔽SQLAlchemy弃用警告
我正在开发的Python包基于SQLAlchemy v1.4,近期暂无升级到v2版本的计划。已将依赖要求设置为SQLAlchemy>=1.3,<2.0,但运行测试时仍收到弃用警告:
[...]/src/db/base.py:12: MovedIn20Warning: Deprecated API features detected! These feature(s) are not compatible with SQLAlchemy 2.0. To prevent incompatible upgrades prior to updating applications, ensure requirements files are pinned to "sqlalchemy<2.0". Set environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings. Set environment variable SQLALCHEMY_SILENCE_UBER_WARNING=1 to silence this message. (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9)
触发警告的代码行是:
PublicBase = sqlalchemy.ext.declarative.declarative_base(metadata=sqlalchemy.schema.MetaData(schema='public'))
这是首次调用SQLAlchemy执行操作的代码。尝试按提示设置SQLALCHEMY_SILENCE_UBER_WARNING环境变量屏蔽警告:在shell中执行export SQLALCHEMY_SILENCE_UBER_WARNING=1可生效,但在代码中通过os.environ['SQLALCHEMY_SILENCE_UBER_WARNING'] = '1'设置(放在触发警告代码行之前),虽已确认变量已设置为1,但警告仍会出现。不希望每位测试用户都手动设置该变量,求解决方法。
方法1:在导入SQLAlchemy前设置环境变量
SQLAlchemy在模块导入阶段就会读取SQLALCHEMY_SILENCE_UBER_WARNING变量,必须把环境变量设置代码放在导入SQLAlchemy的语句之前,示例:
import os os.environ['SQLALCHEMY_SILENCE_UBER_WARNING'] = '1' # 之后再导入SQLAlchemy import sqlalchemy
方法2:使用Python警告过滤器屏蔽特定警告
如果设置环境变量仍有问题,可直接用Python内置的warnings模块过滤MovedIn20Warning,同样要放在导入SQLAlchemy前执行:
import warnings from sqlalchemy.exc import MovedIn20Warning warnings.filterwarnings("ignore", category=MovedIn20Warning) import sqlalchemy
方法3:在测试框架配置中全局设置环境变量
如果使用pytest等测试框架,可在conftest.py中设置环境变量,确保所有测试运行前生效:
# conftest.py import os import pytest def pytest_sessionstart(session): os.environ['SQLALCHEMY_SILENCE_UBER_WARNING'] = '1'
方法4:在开发工具配置中预设环境变量
如果使用tox、poetry等工具,可在配置文件中直接预设环境变量:
- tox:在
tox.ini的[testenv]段添加setenv = SQLALCHEMY_SILENCE_UBER_WARNING=1 - poetry:在
pyproject.toml的测试命令前添加环境变量前缀,比如test = "SQLALCHEMY_SILENCE_UBER_WARNING=1 pytest"
内容的提问来源于stack exchange,提问作者tospo

