当前位置: 首页 > 知识库问答 >
问题:

将ResultProxy作为元组返回,而不是命令

狄玉书
2023-03-14

我有以下代码:

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为这个查询返回元组而不是dicts?我想使用以下样式访问查询结果:

print site.ci
# u'375'

共有3个答案

秦毅
2023-03-14

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

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        
公英哲
2023-03-14

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

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

从文档中:

可以通过整数位置、不区分大小写的列名或模式访问各个列。列对象。例如:

row=fetchone()

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

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

Col3=row[mytable.c.mycol]#通过ColVIII对象进行访问。

劳法
2023-03-14

这是一个老生常谈的问题,但在今天仍然相关。让SQL Alchemy返回字典非常有用,特别是在使用返回JSON的基于RESTful的API时。

下面是我如何在Python 3中使用db\u会话实现的:

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炼金术中是如何工作的:

  • db\u session.execute(query)返回一个ResultProxy对象
  • ResultProxy对象由RowProxy对象组成
  • RowProxy对象具有一个.items()方法,该方法返回行中所有项的键、值元组,该元组可以在for操作中解包为键、值

这里有一个简单的选择:

[{column: value for column, value in rowproxy.items()} for rowproxy in resultproxy]

从文档中:

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

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

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

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

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

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

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

 类似资料:
  • 所以我正在尝试制作一个程序,它将使用HashMap计算一个唯一单词出现在一个小文件中的次数。但是,当我尝试通过在我的HashMap上使用. get(key)来增加重复单词的计数时,它返回true而不是我想要转换为的整数值。如何让我的代码返回值而不是布尔值?这是我到目前为止的代码: 我的FindCommons类: 导入java。util。ArrayList;公共类FindCommons{ }

  • 我试图让2支球队互相比赛。当我说团队1.玩(团队2)时,我称之为;当 i 生成的数字小于 0.5 时,team2 应获胜,如果大于 0.5,则团队 1 应获胜。当团队 1 获胜时,它会正确显示为尼克斯,但当团队 2 获胜时,它会显示内存地址。我怎么能让它正确地说网是赢的,而不是team@78987neu73

  • 我正在为二和leetcode问题实现一个哈希映射。 映射的第一个数组创建一个散列数组作为“索引”,它是nums数组中每个元素的目标差异。然后,我对映射数组应用一个过滤器,以查看映射数组的2个元素是否包含在nums数组中,并返回这些元素的索引。 当索引被过滤到returnedArr中时,它似乎返回nums的第一个元素,而不是两个索引。[2] 返回之前的日志记录显示它正确地分别注册了索引0和1,而不是

  • 我目前正在使用平铺地图为pyplay中的一个游戏开发地图编辑器。关卡由以下结构中的块构建而成(尽管要大得多): 其中“1”是一块墙,“0”是一块空空气。 以下代码基本上是处理块类型更改的代码:

  • 出于某种奇怪的原因..返回,而linux中的命令返回 星期日;星期一;星期二;星期三;星期四;星期五;星期六 任何帮助都将不胜感激,谢谢。

  • 我试图在用POST方法对一些API进行三角化后检查响应状态代码,响应状态代码是Magicmock实例类型,我正在使用比较操作符检查状态代码是否在400和500之间,比较操作符在python 2中工作,但在python 3中引发TypeError 类BMRAPI(对象):root_url=None