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

Posted

技术标签:

【中文标题】SQLAlchemy 查询引发关于 sqlite 和 Decimal 的不必要警告,如何专门禁用?【英文标题】:SQLAlchemy query raises unnecessary warning about sqlite and Decimal, how to specifically disable? 【发布时间】:2016-04-12 22:59:16 【问题描述】:

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

当我构建越来越复杂的查询时,我收到了以下警告:-

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

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

session.query(subquery.c.a*100.0/(subquery.c.b+subquery.c.c))

这里subquery是子查询的名字,a、b、c是整数。

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

【问题讨论】:

【参考方案1】:

您可以像 here 一样忽略 warnings 和 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$')

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

在查询中除以 100.0 时,SQLAlchemy 似乎将此值转换为 Decimal。但是,您可以创建一个 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))

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

P.D.:我使用 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$')

以上是关于SQLAlchemy 查询引发关于 sqlite 和 Decimal 的不必要警告,如何专门禁用?的主要内容,如果未能解决你的问题,请参考以下文章

将为 sqlite 编写的 sqlalchemy 查询转换为 postgres

输入提示sqlalchemy查询结果

SQLAlchemy - 将子查询的模式和数据复制到另一个数据库

Python3+SQLAlchemy+Sqlite3实现ORM教程

SQLAlchemy:pool_size 和 SQLite

每当 MySQL 抛出警告时,我如何通知 sqlalchemy 引发错误?