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

时间:2018-01-26 17:57:28

标签: python sqlalchemy

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

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

我意识到可以做到

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

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

3 个答案:

答案 0 :(得分:17)

当传入ORM检测的描述符(如列)时,每个结果都是名为tuple ,即使只有一列也是如此。您可以使用列表解析中的列名称来“展平”&#39;列表(您可以删除.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值。

答案 1 :(得分:2)

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

Zip official docuementation

  

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的每个tupe初始值,因此您可以从列表中选择第0个元组。

答案 2 :(得分:0)

q_stringlist = [q[0] for q in session.query((distinct(Table.column))).all()]                                                        

用于Flask SQLAlchemy

q_stringlist = [q[0] for q in db.session.query((distinct(Table.column))).all()]