SQLAlchemy查询引发了关于sqlite和Decliter的不必要的警告,如何具体禁用?

xtfmy6hx  于 2023-11-21  发布在  SQLite
关注(0)|答案(2)|浏览(119)

我使用SQLAlchemy通过金字塔访问一个简单的sqlite数据库。
当我构建越来越复杂的查询时,我得到了这样的警告:
SA警告:Dialect sqlite+pysqlite本身 * 不 * 支持十进制对象,SQLAlchemy必须从浮点转换-可能会出现舍入错误和其他问题。请考虑在此平台上将十进制数存储为字符串或整数,以便无损存储。
我的一个问题是这样的(释义):

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

字符串
在本例中,subquery是子查询的名称,a、b和c是整数。
我没有保存查询的结果或运行任何提交,这是纯粹的数据提取/查询,因此当上面的警告被提出时我很惊讶。我如何忽略这个警告而不完全过滤掉它(以防将来我不小心保存Decorative数据到数据库)?

e4yzc0pl

e4yzc0pl1#

你可以忽略warningswarnings.filterwarnings,就像完成here一样:

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。但是,您可以创建一个值为100.0的literal_column

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。

oyt4ldly

oyt4ldly2#

这对我有效(截至2023年11月11日)

import warnings
from sqlalchemy.exc import SAWarning

warnings.filterwarnings("ignore", r".*support Decimal objects natively, and SQLAlchemy", SAWarning)

字符串

相关问题