在 SQLAlchemy 中查询属性列表而不是元组

2025-03-05 09:15:00
admin
原创
68
摘要:问题描述:我正在查询模型的 ID,并返回元组列表(int,)而不是 ID 列表。有没有办法直接查询属性?result = session.query(MyModel.id).all() 我意识到这是可能的results = [r for (r,) in results] 查询是否可以直接返回该表单,而不必自己...

问题描述:

我正在查询模型的 ID,并返回元组列表(int,)而不是 ID 列表。有没有办法直接查询属性?

result = session.query(MyModel.id).all()

我意识到这是可能的

results = [r for (r,) in results]

查询是否可以直接返回该表单,而不必自己处理它?


解决方案 1:

当传入 ORM 检测的描述符(例如列)时,每个结果都是一个命名元组,即使只有一列。您可以在列表推导中使用列名来“展平”列表(您可以删除调用.all(),迭代也会检索对象):

result = [r.id for r in session.query(MyModel.id)]

或者在循环时利用它是一个元组的事实for,并将其解包为目标的单元素元组:

result = session.query(MyModel.id)
for id, in result:
    # do something with the id

后者也可以用于列表推导:

[id for id, in session.query(MyModel.id)]

您实际上没有任何选项可以强制将行结果仅为单一id

解决方案 2:

奇怪的是,SQLalchemy 没有提供合适的解决方案。在 sqlalchemy 中,如果选择一个成员变量(例如列),那么每个结果都是一个命名元组,正如 @Martijn 所说。我使用 python 的 zip 函数找到了解决方案

ZIP 方法

Zip 官方文档

zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)] 返回一个元组列表,其中每个元组包含每个参数序列中的第 i 个元素。返回的列表的长度被截断为最短参数序列的长度。

以你的例子来说

result = session.query(MyModel.id).all()
result = zip(*result)[0]

输出:

[id1, id2, id3...]

它的工作原理是,如果你传递如下列表,它将展平作为参数给出的元组列表

[(key11, key21), (key12,key22)]

Zip 会将此元组列表转换为

[(key11, key12), (key21, key22)]

在您的情况下,您需要 MyModel 的每个元组的初始值,因此您可以从列表中取出第 0 个元组。

链式方法

from itertools import chain
result = session.query(MyModel.id).all()  # result [(id1,), (id2,), (id3,)]
result = list(chain(*result))

输出

[id1, id2, id3]

For 循环

result = session.query(MyModel.id).all()  # result [(id1,), (id2,), (id3,)]
result = [id for id, in result]

输出

[id1, id2, id3]

解决方案 3:

Result.scalars()可以创建一个ScalarResult来接收单个对象而不是 Rows。使用 Core 样式的查询语法,您的示例可能如下所示:

>>> from sqlalchemy import select
>>> from sqlalchemy.orm import sessionmaker

>>> session = sessionmaker(...)
>>> result = session.execute(select(MyModel.id))
>>> result.scalars().all()
[1, 2, 3, ...]
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2757  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1693  
  在全球化的浪潮下,企业的业务范围不断拓展,跨文化协作变得愈发普遍。不同文化背景的团队成员在合作过程中,由于语言、价值观、工作习惯等方面的差异,往往会面临诸多沟通挑战。而产品生命周期管理(PLM)系统作为企业管理产品全生命周期的重要工具,如何有效支持跨文化协作成为了关键问题。通过合理运用沟通策略,PLM系统能够在跨文化团...
plm是什么软件   15  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色,其中文档版本控制是确保产品数据准确性、完整性和可追溯性的关键环节。有效的文档版本控制能够避免因版本混乱导致的错误、重复工作以及沟通不畅等问题,提升企业整体的运营效率和产品质量。接下来,我们将深入探讨 PLM 系统实现文档版本控制的 6...
plm是什么意思   19  
  PLM(产品生命周期管理)项目管理旨在通过有效整合流程、数据和人员,优化产品从概念到退役的整个生命周期。在这个过程中,敏捷测试成为确保产品质量、加速交付的关键环节。敏捷测试强调快速反馈、持续改进以及与开发的紧密协作,对传统的测试流程提出了新的挑战与机遇。通过对测试流程的优化,能够更好地适应PLM项目的动态变化,提升产品...
plm管理系统   18  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用