我有以下代码:
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
这是一个老问题,但今天仍然有用.让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
您是否看过ResultProxy文档?它准确描述了@Gryphius和@Syed Habib M建议使用的内容site['ci']
.
ResultProxy
不会像你声称的那样"返回一个元组" - 它(不奇怪)是一个像元组一样行为(例如打印)的代理,但也支持类字典访问:
来自文档:
可以通过整数位置,不区分大小写的列名称或schema.Column对象访问各列.例如:
row = fetchone()
col1 = row [0]#通过整数位置访问
col2 = row ['col2']#通过名称访问
col3 = row [mytable.c.mycol]#通过Column对象访问.