我有以下代码:
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'
我构建了一个简单的类,在我们的流程中像数据库接口一样工作。在这里,它去:
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
你看了结果代理文档了吗?它准确地描述了@Gryphius和@Syed Habib M的建议,即使用site['ci']
。
ResultProxy
并不像您声称的那样返回元组-它是一个代理,其行为(例如打印)类似元组,但也支持类似字典的访问:
从文档中:
可以通过整数位置、不区分大小写的列名或模式访问各个列。列对象。例如:
row=fetchone()
col1=row[0]#通过整数位置访问
col2=行['col2']#通过名称访问
Col3=row[mytable.c.mycol]#通过ColVIII对象进行访问。
这是一个老生常谈的问题,但在今天仍然相关。让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