我正在开发的一个 Python 包是使用 SQLAlchemy v1.4 构建的,在可预见的将来没有升级到 v2 的计划。
我已经相应地设置了安装要求,以便SQLA版本可以>=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)
触发警告的第12行是这样的:
PublicBase = sqlalchemy.ext.declarative.declarative_base(metadata=sqlalchemy.schema.MetaData(schema='public'))
这是有道理的,因为这是第一次调用 SQLA 来做一些工作。
我想通过设置警告消息中提到的环境变量 SQLALCHEMY_SILENCE_UBER_WARNING
来消除警告。
当我像这样从 shell 执行此操作时,它可以工作并且警告消失了:
export SQLALCHEMY_SILENCE_UBER_WARNING=1
但是当我在触发警告的行(base.py 第 11 行)之前插入以下行时,以便我在代码中包含以下内容:
os.environ['SQLALCHEMY_SILENCE_UBER_WARNING'] = '1'
PublicBase = sqlalchemy.ext.declarative.declarative_base(metadata=sqlalchemy.schema.MetaData(schema='public'))
警告仍然发出。我已经进入 pdb 并检查了 env 变量在定义 PublicBase 时确实设置为 1,所以我不确定为什么这似乎没有生效。有人可以帮忙吗?
编辑: 需要明确的是:不起作用的是在 Python 本身的脚本中设置 env 变量。如果我在 shell 环境中设置变量,它确实可以工作,但这需要每个可能运行测试的用户来设置变量,这不是我想要的。谢谢
最佳答案
SQLAlchemy 不会在每次需要检查是否发出 uber 警告时都查找 envar。它检查 envar 一次,并将结果作为 True
或 False
缓存到变量 SILENCE_UBER_WARNING
中。引用:
但是,看来我们可以自己调整变量:
from sqlalchemy.util import deprecations
deprecations.SILENCE_UBER_WARNING = True
这似乎抑制了警告。
关于sqlalchemy - 设置 SQLALCHEMY_SILENCE_UBER_WARNING 以避免弃用警告不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76307478/