我正在查询模型的ID,并获取(int,)
元组的列表而不是id列表。有没有办法直接查询属性?
result = session.query(MyModel.id).all()
我意识到可以做到
results = [r for (r,) in results]
查询是否可以直接返回该表单,而不必自己处理它?</ p>
答案 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(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()]