sqlalchemy - 设置 SQLALCHEMY_SILENCE_UBER_WARNING 以避免弃用警告不起作用

标签 sqlalchemy environment-variables

我正在开发的一个 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 一次,并将结果作为 TrueFalse 缓存到变量 SILENCE_UBER_WARNING 中。引用:

https://github.com/sqlalchemy/sqlalchemy/blob/8e465ce2788a726c614c060c11ae77b05d0b99af/lib/sqlalchemy/util/deprecations.py#L26

但是,看来我们可以自己调整变量:

from sqlalchemy.util import deprecations
deprecations.SILENCE_UBER_WARNING = True

这似乎抑制了警告。

关于sqlalchemy - 设置 SQLALCHEMY_SILENCE_UBER_WARNING 以避免弃用警告不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76307478/

相关文章:

python - Flask-SQLAlchemy : Manipulate attribute of a data upon fetching

python - SQLAlchemy PyODBC MS SQL Server 无 DSN 连接

java - 在错误目录中的 macOS (10.12.3) 上安装了 Java SDK 8

android - 如何设置Android环境变量让app继承?

vue.js - Vue cli - 类型错误 : Cannot read property 'env' of undefined

python - SQLAlchemy + MariaDB : MySQL server has gone away

python - 从 sqlalchemy Session 获取一个 mysql 线程 id

bash - 以(半)自动方式设置 FLASK_APP

environment-variables - Ansible - 包括来自外部 YML 的环境变量

postgresql - flask SQLAlchemy : application crashed on postgres server reboot