如何检索 SQLAlchemy 结果集的 python 列表? [复制]
Posted
技术标签:
【中文标题】如何检索 SQLAlchemy 结果集的 python 列表? [复制]【英文标题】:How to retrieve python list of SQLAlchemy result set? [duplicate] 【发布时间】:2012-11-01 19:38:10 【问题描述】:我有以下查询来检索单列数据:
routes_query = select(
[schema.stop_times.c.route_number],
schema.stop_times.c.stop_id == stop_id
).distinct(schema.stop_times.c.route_number)
result = conn.execute(routes_query)
return [r['route_number'] for r in result]
我想知道是否有更简洁的方法来检索返回的数据行的本机列表。
【问题讨论】:
准备好让别人证明我错了,但从我对 SQLAlchemy 的记忆来看,它故意牺牲易用性来直接模拟这样的 SQL 查询,以使其更容易映射数据到 Python 中的对象。也许您可以以更有利于直接对象映射的方式对数据进行建模,或者使用不同的工具来完成这项任务? SQLAlchemy 的全部目的是在编写支持数据库的应用程序时易于使用。 【参考方案1】:将 1 元素元组列表提取到列表中的最简洁方法是:
result = [r[0] for r in result]
或:
result = [r for r, in result]
【讨论】:
如果为空则不选择 returnNone
,需要将列表理解包装在 if
语句中?
execute() 总是返回一个结果代理,如果没有结果,那么迭代它只会产生一个零长度的迭代器。我在那里的愚蠢的“拉链”东西失败了,把它拿出来。
.all() 是当您使用 Query 时,是的 .all() 在这里采用不同的方法,当结果是一个映射实体时,将其作为标量列表返回。但如果你正在处理离散列,[r for r, in result]
几乎就是我所做的
这几乎就是我所拥有的,我想这已经是最好的了。感谢您的回答。
@licorna for (r, ) in listOfOneTuples
基本上在每次迭代时从元组中解包元组值。由于括号对于元组是可选的,所以你可以写for r, in listOfOneTuples
。对于非单元组,你可以写 for a, b, c in listOfTuples
来解压它们。【参考方案2】:
这是我会使用的:
return zip(*result)[0]
zzzeek 的答案中的列表理解方法更简洁(22 个字符而不是 29 或 31 个字符),并且对于更大的结果将this answer 中的时间设置为类似的问题表明它也更快。
【讨论】:
请注意,在 Python 3 中,zip
返回一个不可下标的迭代器。此外,如果您的查询未返回任何结果,您将在尝试访问第一项时收到 IndexError
。以上是关于如何检索 SQLAlchemy 结果集的 python 列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章