我有以下代码:
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在这个查询中返回元组,而不是字典?我想使用以下样式来访问查询结果:
print site.ci
# u'375'发布于 2018-05-03 03:09:19
这是一个古老的问题,但在今天仍然有意义。让SQL Alchemy返回字典非常有用,尤其是在使用基于RESTful的API返回JSON时。
下面是我在Python3中使用db_session实现的方法:
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()方法,该方法返回行中所有项目的键、值的元组,可以在<代码>D16操作中解压缩为key, value。这里有一个简单的替代方案:
[{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
发布于 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 #通过列对象访问。
发布于 2019-02-19 03:04:01
我已经构建了一个简单的类来在我们的流程中像数据库接口一样工作。它是这样的:
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 https://stackoverflow.com/questions/20743806
复制相似问题