如何检索 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]

【讨论】:

如果为空则不选择 return None,需要将列表理解包装在 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 列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

6.18—045—周二

SQLAlchemy ResultProxy.rowcount 不应为零

如何在 D3 中检索嵌套数据集的键值

PHP MySQL Cursor 实现以及它们如何管理内存

如何将 SqlAlchemy 结果序列化为 JSON?

Graphene/Flask/SQLAlchemy - 从路由入口点检索数据的推荐方法是啥?