SQLAlchemy 查询引发有关 sqlite 和 Decimal 的不必要警告,如何专门禁用?

Ng *_*-Ee 5 python sqlite sqlalchemy pyramid

我通过金字塔使用 SQLAlchemy 访问简单的 sqlite 数据库。

当我构建逐渐复杂的查询时,我收到以下警告:-

SAWarning:方言 sqlite+pysqlite 本身不支持Decimal 对象,SQLAlchemy 必须从浮点转换 - 可能会出现舍入错误和其他问题。请考虑在此平台上将十进制数字存储为字符串或整数,以实现无损存储。

我的一个查询就是这样做的(释义):-

session.query(subquery.c.a*100.0/(subquery.c.b+subquery.c.c))
Run Code Online (Sandbox Code Playgroud)

在本例中,subquery 是子查询的名称,a、b 和 c 是整数。

我没有保存查询结果或运行任何提交,这纯粹是数据提取/查询,因此当出现上述警告时我感到很惊讶。如何忽略此警告而不完全过滤掉它(以防将来我不小心将十进制数据保存到数据库中)?

ago*_*old 7

您可以忽略警告,如下warnings.filterwarnings所示:

import warnings
from sqlalchemy.exc import SAWarning
warnings.filterwarnings('ignore',
 r"^Dialect sqlite\+pysqlite does \*not\* support Decimal objects natively\, "
 "and SQLAlchemy must convert from floating point - rounding errors and other "
 "issues may occur\. Please consider storing Decimal numbers as strings or "
 "integers on this platform for lossless storage\.$",
 SAWarning, r'^sqlalchemy\.sql\.type_api$')
Run Code Online (Sandbox Code Playgroud)

编辑:使用 SQLite 和 SQLAlchemy 的十进制值的问题已经在这个问题中讨论过,这个答案建议创建TypeDecorator将十进制值内部存储为文本。

对于查询中除以 100.0 的情况,该值似乎是Decimal由 SQLAlchemy 转换的。但是您可以创建一个literal_column值为 100.0 的值:

import sqlalchemy
val100 = sqlalchemy.sql.expression.literal_column("100.0")
session.query(subquery.c.a*val100/(subquery.c.b+subquery.c.c))
Run Code Online (Sandbox Code Playgroud)

使用此解决方案时,它不会向我显示警告。

PD:我使用 SQLAlchemy 版本 1.0.11 和 Python 2.7.11。

  • 在撰写本文时,sqlalchemy 1.2.10 的类型不在“type_api”中,而是在“sqltypes”中,正则表达式对我也不起作用。对我来说,这有效:`warnings.filterwarnings('ignore', r".*support Decimal objects natively", SAWarning, r'^sqlalchemy\.sql\.sqltypes$')` (2认同)