天道酬勤,学无止境

Sqlalchemy query returns Decimal object

I have the following model:

  172  class ReportRecord(db.Model):                                                                                                                                                                                
  173     __tablename__ = 'tb_report_record'                                                                                                                                                                         174                                                                                                                                                                                                                175     id = db.Column(Integer, primary_key=True)                                                                                                                                                                
  176     report_id = db.Column(ForeignKey('tb_rua_report.id'), index=True)                                                                                                                                        
  177     source_ip = db.Column(String(100, 'utf8_bin'))                                                                                                                                                           
  178     count = db.Column(Integer)                                                                                                                                                                               
  179     disposition = db.Column(String(10, 'utf8_bin'))                                                                                                                                                          
  180     header_from = db.Column(String(100, 'utf8_bin'))                                                                                                                                                         
  181     spf_domain = db.Column(String(100, 'utf8_bin'))                                                                                                                                                          
  182     spf_result = db.Column(String(10, 'utf8_bin'))                                                                                                                                                           
  183     dkim_domain = db.Column(String(100, 'utf8_bin'))                                                                                                                                                         
  184     dkim_result = db.Column(String(10, 'utf8_bin'))                                                                                                                                                          
  185     isActive = db.Column(Integer, nullable=False, server_default=text("'1'"))                                                                                                                                  186     created_by = db.Column(String(100), nullable=False, server_default=text("'System'"))                                                                                                                     
  187     created_dt = db.Column(DateTime, nullable=False)                                                                                                                                                         
  188     last_modified_by = db.Column(String(100), nullable=False, server_default=text("'System'"))                                                                                                               
  189     last_modified_dt = db.Column(DateTime, server_default=text("CURRENT_TIMESTAMP"))                                                                                                                         
  190                                                                                                                                                                                                              
  191     report = db.relationship('RuaReport', backref=db.backref("record"))

When I am issuing the following query from flasksqlalchemy

ReportRecord.query.filter(or_(ReportRecord.spf_result=="pass", ReportRecord.dkim_result=="pass")).with_entities(func.sum(ReportRecord.count).label('total_passed')).all()

I get the following output:

[(Decimal('930'),)]

Now the value that I get is correct, but I cannot jsonify it directly. Doing a int(Decimal('930')) does give me the desired result but what is the default way to get this data converted in the right format?

评论

This worked for me: Include this in your imports:

from sqlalchemy import func

then:

total_passed = db.session.query(func.sum(ReportRecord.count)).scalar()

This returns 930 instead of [(Decimal('930'),)]

Read more about .scalar()

How about converting the decimal while querying it?

Try int(func.sum(ReportRecord.count).label('total_passed'))

try enforcing your db to cast values into integer should solve your problem

I cannot check but there is a cast function which might be useful as well

from sqlalchemy.sql.expression import cast
cast(func.sum(ReportRecord.count).label('total_passed'),sqlalchemy.Integer)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 我应该如何在SQLalchemy和SQLite中处理小数(How should I handle decimal in SQLalchemy & SQLite)
    问题 当我在SQLite数据库引擎中使用数值列时,SQLalchemy给我以下警告。 SAWarning:方言sqlite + pysqlite本身不支持Decimal对象 我试图找出在仍然使用SQLite的同时在SQLalchemy中具有pkgPrice = Column(Numeric(12,2))的最佳方法。 问题[1]如何将Python十进制转换为SQLite数字? 显示了一种使用sqlite3.register_adapter(D, adapt_decimal)使SQLite接收并返回Decimal,但存储字符串的方法,但是我还不知道如何挖掘SQLAlchemy核心来执行此操作。 类型装饰器看起来像是正确的方法,但我还不喜欢它们。 是否有人有SQLAlchemy类型装饰器配方,该配方在SQLAlchemy模型中具有数字或十进制数字,但是将它们存储为字符串在SQLite中? 回答1 from decimal import Decimal as D import sqlalchemy.types as types class SqliteNumeric(types.TypeDecorator): impl = types.String def load_dialect_impl(self, dialect): return dialect.type_descriptor
  • 使用python ORM来操作MySQL
    昨天的博客是用MySQL官方的MySQL-connector驱动来完成数据库的连接和使用,但只适用于小项目的操作,当项目规模增加时,代码会越来越复杂,维护成本也越来越高,此时需要一个更好的设计模式。即使用ROM框架来操作MySQL。 ORM英文是(Object Relation Mapping),中文意思是对象关系映射,它是RDBMS和业务实体对象之间的一个映射。换句话说,是将底层的RDBMS封装成业务实体对象,提供给业务逻辑层使用。优点是: 一旦定义好了对象模型,就可以让他们简单可复用,从而不必关注底层的数据库访问细节,只将注意力集中到业务逻辑层面就可以了。即便数据库本身进行了更换,在业务逻辑代码上也不会有大的调整。因为OR 抽象了数据的存取,同时也兼容了多种DBMS,不必关心底层采用的是哪种DBMS,例如MySQL,SQL Server,PostgreSQL或SQLite。 缺点:对于一些复杂的数据查询,ORM会显得力不从心,性能会有损失。有时相对直接编写SQL查询语句来说,ORM编写的代码量和花费的时间会比较多。 python中的ORM框架有三种较为主流的: Django,它是Python的web应用开发框架,大而全。采用了MTV的框架模式,包括了Model(模式),View(视图)和Template(模板)。Model模型只是Django的一部分功能
  • 如何将SqlAlchemy结果序列化为JSON?(How to serialize SqlAlchemy result to JSON?)
    问题 Django有一些很好的自动ORM模型从数据库返回到JSON格式的自动序列化。 如何将SQLAlchemy查询结果序列化为JSON格式? 我尝试了jsonpickle.encode但它对查询对象本身进行了编码。 我尝试了json.dumps(items)但它返回 TypeError: <Product('3', 'some name', 'some desc')> is not JSON serializable 将SQLAlchemy ORM对象序列化为JSON / XML真的很困难吗? 没有默认的序列化程序吗? 如今,序列化ORM查询结果是非常常见的任务。 我需要的只是返回SQLAlchemy查询结果的JSON或XML数据表示形式。 javascript datagird(JQGrid http://www.trirand.com/blog/)中需要使用JSON / XML格式的SQLAlchemy对象查询结果 回答1 平面实施 您可以使用以下方式: from sqlalchemy.ext.declarative import DeclarativeMeta class AlchemyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj.__class__, DeclarativeMeta
  • Why is “Object of type Decimal is not JSON serializable” - when using marshmallow with SQLAlchemy automap?
    Using automap_base from sqlalchemy.ext.automap to map my tables. Not able to shema.dumps(result); getting raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type Decimal is not JSON serializable Tried using JSON custom decoders, but no use. from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy.orm import Session from sqlalchemy.ext.automap import automap_base from flask_marshmallow import Marshmallow app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' db = SQLAlchemy(app) ma = Marshmallow(app) engine = db
  • SQLAlchemy:打印实际查询(SQLAlchemy: print the actual query)
    问题 我真的很想能够为我的应用程序打印出有效的SQL,包括值,而不是绑定参数,但是如何在SQLAlchemy中做到这一点并不清楚(通过设计,我很确定)。 有没有人以一般的方式解决了这个问题? 回答1 在大多数情况下,SQLAlchemy语句或查询的“字符串化”很简单: print(str(statement)) 这既适用于ORM Query ,也适用于任何select()或其他语句。 注意:以下详细答案正在sqlalchemy文档中维护。 要将语句编译为特定的方言或引擎,如果语句本身尚未绑定到该语句,则可以将其传递给compile(): print(statement.compile(someengine)) 或没有引擎: from sqlalchemy.dialects import postgresql print(statement.compile(dialect=postgresql.dialect())) 当给定一个ORM Query对象时,为了获得compile()方法,我们只需要首先访问.statement访问器即可: statement = query.statement print(statement.compile(someengine)) 关于将绑定参数“内联”到最终字符串中的原始规定,此处的挑战是SQLAlchemy通常不承担此任务,因为这是由Python
  • SQLAlchemy 选择在 SQLite 表上给出不同的结果,原始 sql 与可选择的(SQLAlchemy selects give different results on SQLite table, raw sql versus selectable)
    问题 在使用 pandas 和 dask 读取 SQLite 表时,当我从 SQLite 表中选择日期时间(ISO 格式字符串)存储为 NUMERIC 数据类型时,我遇到了 SQLAlchemy 的一些意外行为。 SQLAlchemy 原始 SQL 查询工作正常,但使用从反射构造的可选择项的查询失败。 这两个查询似乎是等效的。 我在下面粘贴了一个示例以及回溯。 有人可以解释示例中的第三个查询有什么问题吗? 使用 NUMERIC 日期时间设置表: import sqlalchemy as sa from sqlalchemy import text connString = "sqlite:///c:\\temp\\test.db" engine = sa.create_engine(connString) conn = engine.connect() conn.execute("create table testtable (uid INTEGER Primary Key, datetime NUMERIC)") conn.execute("insert into testtable values (1, '2017-08-03 01:11:31')") print(conn.execute('PRAGMA table_info(testtable)').fetchall())
  • 在Flask中为SQLAlchemy结果集jsonify [重复](jsonify a SQLAlchemy result set in Flask [duplicate])
    问题 这个问题已经在这里有了答案: 如何将SqlAlchemy结果序列化为JSON? (29个答案) 2年前关闭。 我正在尝试对Flask / Python中的SQLAlchemy结果集进行json化。 Flask邮件列表建议使用以下方法http://librelist.com/browser//flask/2011/2/16/jsonify-sqlalchemy-pagination-collection-result/#04a0754b63387f87e59dda564bde426e: return jsonify(json_list = qryresult) 但是我得到以下错误: TypeError: <flaskext.sqlalchemy.BaseQuery object at 0x102c2df90> is not JSON serializable 我在这里俯瞰什么? 我发现了这个问题:如何将SqlAlchemy结果序列化为JSON? 看起来非常相似,但是我不知道Flask是否具有某些使魔术变得更容易的魔术,如邮件列表中所建议的那样。 编辑:为澄清起见,这就是我的模型的样子 class Rating(db.Model): __tablename__ = 'rating' id = db.Column(db.Integer, primary_key=True)
  • 反映表时如何使sqlalchemy返回浮点数而不是十进制数?(How to make sqlalchemy return float instead of Decimal when reflecting tables?)
    问题 我有一个在 Python 代码之外定义的 MySQL 数据库。 我正在使用反射将其导入 SQLAlchemy,因此我没有任何可以修改的类定义。 我不必担心会丢失精度,而且我在 Python 中对结果进行了一些算术运算,所以我宁愿不必手动将一堆值转换为浮点数或小数。 import sqlalchemy as sa eng = sa.create_engine("mysql+pymysql://user:passwd@server/database") eng.execute("create table if not exists foo (x double not null)") eng.execute("insert into foo (x) values (0.1)") md = sa.MetaData(bind=eng) md.reflect() foo = md.tables["foo"] res = eng.execute(foo.select()) row = res.fetchone() print(type(row.x)) print(repr(foo.c.x.type)) 输出: <class 'decimal.Decimal'> DOUBLE 回答1 使用这篇文章中的建议,并且在设置asdecimal属性之前不使用反射表,我可以获得浮点数而不是小数。
  • SQLAlchemy 自定义查询列(SQLAlchemy custom query column)
    问题 我有一个这样定义的声明表: class Transaction(Base): __tablename__ = "transactions" id = Column(Integer, primary_key=True) account_id = Column(Integer) transfer_account_id = Column(Integer) amount = Column(Numeric(12, 2)) ... 查询应该是: SELECT id, (CASE WHEN transfer_account_id=1 THEN -amount ELSE amount) AS amount FROM transactions WHERE account_id = 1 OR transfer_account_id = 1 我的代码是: query = Transaction.query.filter_by(account_id=1, transfer_account_id=1) query = query.add_column(case(...).label("amount")) 但它不会替换amount列。 一直试图用几个小时来做​​到这一点,我不想使用原始 SQL。 回答1 您所做的任何查询都不会替换原始amount列。 但是您可以使用以下查询加载另一列: q =
  • 如何将SQL查询结果转换为PANDAS数据结构?(How to convert SQL Query result to PANDAS Data Structure?)
    问题 在这个问题上的任何帮助将不胜感激。 因此,基本上我想对我的SQL数据库运行查询并将返回的数据存储为Pandas数据结构。 我已附上查询代码。 我正在阅读有关Pandas的文档,但是在识别查询的返回类型时遇到了问题。 我试图打印查询结果,但没有提供任何有用的信息。 谢谢!!!! from sqlalchemy import create_engine engine2 = create_engine('mysql://THE DATABASE I AM ACCESSING') connection2 = engine2.connect() dataid = 1022 resoverall = connection2.execute(" SELECT sum(BLABLA) AS BLA, sum(BLABLABLA2) AS BLABLABLA2, sum(SOME_INT) AS SOME_INT, sum(SOME_INT2) AS SOME_INT2, 100*sum(SOME_INT2)/sum(SOME_INT) AS ctr, sum(SOME_INT2)/sum(SOME_INT) AS cpc FROM daily_report_cooked WHERE campaign_id = '%s'", %dataid) 因此,我有点想了解变量“ resoverall
  • Convert a complex SQL query to SQLAlchemy
    I run out of ideas. I googled now more then one day and I still can't find any useful answer to my question. What I did until now, I tried to use raw SQL but without luck. locations = db.session.query(Location, select([text('( 6371 * acos( cos( radians("53.6209798282177") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians("13.96948162900808") ) + sin( radians("53.6209798282177") ) * sin( radians( lat ) ) ) )')]).label('distance')).having('distance' < 25).all() When using this raw SQL query I get zero results returned, but when running the same query in mysql it returns correct results
  • sqlAlchemy 中的求和字段(Sum fields in sqlAlchemy)
    问题 我最近升级到最新版本的 sqlalchemy,我的一些代码不再有效。 我很难找到如何修复它并且可以用手。 以前查询是这样出现的。 self.db.query(Drive).filter(Drive.package_id==package.package_id)\ .filter(Drive.wipe_end!=None).sum(Drive.wipe_end - Drive.wipe_start) 这以前可以检索一些持续时间的总和,但现在我收到以下错误: 'Query' object has no attribute 'sum' 我做的任何谷歌搜索都会得到几年前的信息。 回答1 我相信您需要“func”包中的 sum() 函数: from sqlalchemy import func cursor = self.db.query(func.sum(Drive.wipe_end - Drive.wipe_start)).filter(Drive.package_id==package.package_id).filter(Drive.wipe_end!=None) total = cursor.scalar() 回答2 在 SQLAlchemy 1.1.13(2017 年 8 月 3 日发布)中,使用sum()的语法如下: from sqlalchemy import func
  • 熊猫 - cdecimal.ConversionSyntax invalidOperation on read_sql_query()(pandas - cdecimal.ConversionSyntax invalidOperation on read_sql_query())
    问题 在使用数据库decimal数据类型时,我遇到了 Pandas read_sql_query() 函数的问题。 使用varchar或integer类型时,我对下面的相同代码没有任何问题。 版本信息: CentOS 6.6 Python 2.7.10 :: Anaconda 2.3.0 (64-bit) # packages in environment at /opt/anaconda: pandas 0.16.2 np19py27_0 cdecimal 2.3 py27_0 pyodbc 3.0.10 py27_0 sqlalchemy 1.0.8 py27_0 下面是我尽可能减少的代码以复制错误。 我也尝试过通过 sqlalchemy 并得到同样的错误。 (netezza没有sqlalchemy引擎所以还是需要依赖pyodbc。) import pyodbc import pandas as pd connection = pyodbc.connect("Driver={NetezzaSQL};servername=nzserver;database=MASTER;username=USER_GUY;password=****") sql = "select cast(0.0 as decimal(6,2)) as testing " data = pd.io.sql
  • SQLAlchemy selects give different results on SQLite table, raw sql versus selectable
    While reading SQLite tables using pandas and dask, I came across some unexpected behavior of SQLAlchemy when selecting from SQLite tables with datetimes (ISO formatted strings) stored as NUMERIC data type. An SQLAlchemy raw SQL query works fine, but a query using a selectable constructed from reflection fails. The two queries appear to be equivalent. I have pasted an example below, along with the traceback. Can someone explain what is wrong with the third query in the example? Set up table with NUMERIC datetime: import sqlalchemy as sa from sqlalchemy import text connString = "sqlite:///c:\
  • 使用 ORM 时的情况(SQLalchemy)(CASE WHEN with ORM (SQLalchemy))
    问题 我正在将 SQLAlchemy 与 ORM paragdim 一起使用。 我没有设法找到执行 CASE WHEN 指令的方法。 我在网上找不到有关此的信息。 是否可以 ? 回答1 请参阅文档页面上的 sqlalchemy.sql.expression.case 函数和更多示例。 但它看起来像这样(来自链接到的文档的逐字逐句): case([(orderline.c.qty > 100, item.c.specialprice), (orderline.c.qty > 10, item.c.bulkprice) ], else_=item.c.regularprice) case(value=emp.c.type, whens={ 'engineer': emp.c.salary * 1.1, 'manager': emp.c.salary * 3, }) 编辑1 :(回答评论)当然可以,请参见下面的示例: class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) first_name = Column(String) last_name = Column(String) xpr = case([(User.first_name !=
  • 使用 python 从 hive 读取数据时的性能问题(Performance issue while reading data from hive using python)
    问题 我在 hive 中有一个表,有 351 837(110 MB 大小)记录,我正在使用 python 读取该表并写入 sql server。 在这个过程中,将 hive 中的数据读入 Pandas 数据帧需要很长时间。 当我加载整个记录 (351k) 时,需要 90 分钟。 为了改进,我采用了以下方法,例如从 hive 读取 10k 行并写入 sql server。 但是从 hive 读取 10k 行并将其分配给 Dataframe 仅需要 4-5 分钟的时间。 def execute_hadoop_export(): """ This will run the steps required for a Hadoop Export. Return Values is boolean for success fail """ try: hql='select * from db.table ' # Open Hive ODBC Connection src_conn = pyodbc.connect("DSN=****",autocommit=True) cursor=src_conn.cursor() #tgt_conn = pyodbc.connect(target_connection) # Using SQLAlchemy to dynamically generate
  • 将复杂的 SQL 查询转换为 SQLAlchemy(Convert a complex SQL query to SQLAlchemy)
    问题 我的想法用完了。 我现在用谷歌搜索了超过一天,但我仍然找不到任何有用的答案来解决我的问题。 到目前为止我所做的,我尝试使用原始 SQL 但没有运气。 locations = db.session.query(Location, select([text('( 6371 * acos( cos( radians("53.6209798282177") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians("13.96948162900808") ) + sin( radians("53.6209798282177") ) * sin( radians( lat ) ) ) )')]).label('distance')).having('distance' < 25).all() 使用这个原始 SQL 查询时,我返回零结果,但在mysql运行相同的查询时,它返回正确的结果。 此外,我还发现,在将查询打印到终端时,它无法正确处理HAVING()子句。 我的查询在打印时如下所示: SELECT location.id AS location_id, location.created_date AS location_created_date, location.zip AS location_zip, location
  • 使用自定义JSON编码器进行SQLAlchemy的PostgreSQL JSONB实现(Using a custom JSON encoder for SQLAlchemy's PostgreSQL JSONB implementation)
    问题 我正在使用SQLAlchemy的核心库来访问某些PostgreSQL数据库。 考虑一下我有下表: create table foo (j jsonb); 以及以下python代码: from decimal import * from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, DateTime from sqlalchemy.dialects.postgresql import JSONB metadata = MetaData(schema="public") foo = Table('foo', metadata,Column('f', JSONB)) d = Decimal(2) ins = foo.insert().values(j = {'d': d}) # assuming engine is a valid sqlalchemy's connection engine.execute(ins) 最后一句失败,并出现以下错误: StatementError("(builtins.TypeError) Decimal('2') is not JSON serializable",) 这就是为什么我问这个问题
  • Flask-03-Jinja2模板引擎、过滤器、模板继承、解决csrf攻击、数据库操作(ORM,Flask-SQLAlchemy)、数据表操作(增删改查)
    一、Jinja2模板引擎 Flask内置的模板语言,它的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能。 渲染模版函数 Flask提供的 render_template 函数封装了该模板引擎render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。 1.模板基本使用 (1)在flask应用对象创建的时候,设置或者保留template_folder参数,创建模板目录 app = Flask(__name__,template_folder='templates') (2)在项目下创建 templates 文件夹,用于存放所有的模板文件,并在目录下创建一个模板html文件 index1.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{title}}</h1> <p>num={{num}}</p> </body> </html> (3)在视图函数设置渲染模板并设置模板数据 from flask import Flask,render_template app = Flask(__name__, template_folder=
  • 一篇博客搞定flask基础(完结)
    1.flask基础知识 1.1 flask框架介绍 Flask相比于django更加的轻量级,最核心的两个模块: Werkzeug(路由模块),模板引擎则使用 Jinja2。Flask不像django自带各种模块,用于一些小中型的项目开发。 Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。 Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。 其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。 官网: https://flask.palletsprojects.com/en/1.1.x/ 官方文档: http://docs.jinkan.org/docs/flask/ Flask常用第三方扩展包: Flask-SQLalchemy:操作数据库,ORM;Flask-script:终端脚本工具,脚手架;Flask