首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy execute()将ResultProxy作为元组返回,而不是作为字典返回

SQLAlchemy execute()将ResultProxy作为元组返回,而不是作为字典返回
EN

Stack Overflow用户
提问于 2013-12-23 20:39:49
回答 8查看 106.1K关注 0票数 26

我有以下代码:

代码语言:javascript
复制
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 
# <sqlalchemy.engine.result.ResultProxy object at 0x033E63D0>

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

为什么SQLAlchemy在这个查询中返回元组,而不是字典?我想使用以下样式来访问查询结果:

代码语言:javascript
复制
print site.ci
# u'375'
EN

回答 8

Stack Overflow用户

发布于 2018-05-03 03:09:19

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

下面是我在Python3中使用db_session实现的方法:

代码语言:javascript
复制
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中是如何工作的:

  • Thedb_session.execute(query)返回ResultProxy对象
  • ResultProxy对象由RowProxy对象组成
  • RowProxy对象有一个.items()方法,该方法返回行中所有项目的键、值的元组,可以在<代码>D16操作中解压缩为key, value

这里有一个简单的替代方案:

代码语言:javascript
复制
[{column: value for column, value in rowproxy.items()} for rowproxy in resultproxy]

从文档中:

类sqlalchemy.engine.RowProxy(父级、行、处理器、快捷键映射)

来自单个游标行的代理值。

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

如果此RowProxy包含给定的密钥,则has_key( key )返回True。

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

RowProxy ()返回由该key表示的字符串形式的键列表。

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

票数 52
EN

Stack Overflow用户

发布于 2015-07-08 01:34:56

你看过ResultProxy文档了吗?它准确地描述了@Gryphius和@Syed Habib的建议,即使用site['ci']

ResultProxy并不像你所说的那样“返回元组”--它是一个代理(毫不奇怪),它的行为(例如打印)类似于元组,但也支持类似字典的访问:

从文档中:

可以通过整型位置、不区分大小写的列名或schema.Column对象来访问

各个列。例如:

row = fetchone()

col1 =行#通过整数位置访问

col2 = row'col2‘#通过名称访问

col3 = rowmytable.c.mycol #通过列对象访问。

票数 21
EN

Stack Overflow用户

发布于 2019-02-19 03:04:01

我已经构建了一个简单的类来在我们的流程中像数据库接口一样工作。它是这样的:

代码语言:javascript
复制
from sqlalchemy import create_engine
class DBConnection:
    def __init__(self, db_instance):
        self.db_engine = create_engine('your_database_uri_string')
        self.db_engine.connect()

    def read(self, statement):
        """Executes a read query and returns a list of dicts, whose keys are column names."""
        data = self.db_engine.execute(statement).fetchall()
        results = []

        if len(data)==0:
            return results

        # results from sqlalchemy are returned as a list of tuples; this procedure converts it into a list of dicts
        for row_number, row in enumerate(data):
            results.append({})
            for column_number, value in enumerate(row):
                results[row_number][row.keys()[column_number]] = value

        return results        
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20743806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档