SQLAlchemy execute()将ResultProxy作为Tuple返回,而不是dict

 LIN-少爷 发布于 2023-02-08 14:45

我有以下代码:

query = """
SELECT Coalesce((SELECT sp.param_value
                 FROM   sites_params sp
                 WHERE  sp.param_name = 'ci'
                        AND sp.site_id = s.id
                 ORDER  BY sp.id DESC
                 LIMIT  1), -1) AS ci
FROM   sites s
WHERE  s.deleted = 0
       AND s.id = 10 

"""

site = db_session.execute(query)
# print site 
# 

site = db_session.execute(query).fetchone()
print site  # (u'375')
print list(site) # [u'375']

为什么SQLAlchemy会为此查询返回元组而不是dicts?我想使用以下样式来访问查询的结果:

print site.ci
# u'375'

jasonrhaas.. 17

这是一个老问题,但今天仍然有用.让SQL Alchemy返回字典非常有用,尤其是在使用返回JSON的基于RESTful的API时.

以下是我db_session在Python 3中使用它的方法:

resultproxy = db_session.execute(query)

d, a = {}, []
for rowproxy in resultproxy:
    # rowproxy.items() returns an array like [(key0, value0), (key1, value1)]
    for column, value in rowproxy.items():
        # build up the dictionary
        d = {**d, **{column: value}}
    a.append(d)

最终结果是该数组a现在以字典格式包含您的查询结果.

至于它如何在SQL Alchemy中工作:

db_session.execute(query)回报ResultProxy对象

ResultProxy物体是由RowProxy物体

RowProxy对象有一个.items()方法,它返回行中所有项的键值元组.

来自文档:

class sqlalchemy.engine.RowProxy(父级,行,处理器,键映射)

单个游标行的代理值.

主要遵循"有序字典"行为,将结果值映射到基于字符串的列名,行中结果的整数位置,以及可以映射到生成此结果集的原始列的列实例(对于结果)对应于构造的SQL表达式).

has_key(key)如果此RowProxy包含给定键,则返回True.

items()返回元组列表,每个元组包含一个键/值对.

keys()将键列表作为此RowProxy表示的字符串返回.

链接:http: //docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.RowProxy.items

2 个回答
  • 这是一个老问题,但今天仍然有用.让SQL Alchemy返回字典非常有用,尤其是在使用返回JSON的基于RESTful的API时.

    以下是我db_session在Python 3中使用它的方法:

    resultproxy = db_session.execute(query)
    
    d, a = {}, []
    for rowproxy in resultproxy:
        # rowproxy.items() returns an array like [(key0, value0), (key1, value1)]
        for column, value in rowproxy.items():
            # build up the dictionary
            d = {**d, **{column: value}}
        a.append(d)
    

    最终结果是该数组a现在以字典格式包含您的查询结果.

    至于它如何在SQL Alchemy中工作:

    db_session.execute(query)回报ResultProxy对象

    ResultProxy物体是由RowProxy物体

    RowProxy对象有一个.items()方法,它返回行中所有项的键值元组.

    来自文档:

    class sqlalchemy.engine.RowProxy(父级,行,处理器,键映射)

    单个游标行的代理值.

    主要遵循"有序字典"行为,将结果值映射到基于字符串的列名,行中结果的整数位置,以及可以映射到生成此结果集的原始列的列实例(对于结果)对应于构造的SQL表达式).

    has_key(key)如果此RowProxy包含给定键,则返回True.

    items()返回元组列表,每个元组包含一个键/值对.

    keys()将键列表作为此RowProxy表示的字符串返回.

    链接:http: //docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.RowProxy.items

    2023-02-08 14:48 回答
  • 您是否看过ResultProxy文档?它准确描述了@Gryphius和@Syed Habib M建议使用的内容site['ci'].

    ResultProxy不会像你声称的那样"返回一个元组" - 它(不奇怪)是一个像元组一样行为(例如打印)的代理,但也支持类字典访问:

    来自文档:

    可以通过整数位置,不区分大小写的列名称或schema.Column对象访问各列.例如:

    row = fetchone()

    col1 = row [0]#通过整数位置访问

    col2 = row ['col2']#通过名称访问

    col3 = row [mytable.c.mycol]#通过Column对象访问.

    2023-02-08 14:48 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有