SQLAlchemy从查询中获取id列表

时间:2014-07-03 18:30:35

标签: python sqlalchemy

如何获取ID列表而不是SQLAlchemy对象列表? 目前我正在这样做:

[x.id for x in random_query.all()]

有没有更好的方法,最好只使用SQLAlchemy语句。

5 个答案:

答案 0 :(得分:6)

SQL

 SELECT DISTINCT `id` FROM `table`;

的Python

 for value in Session.query(Table.id).distinct():
     #Do something Append

答案 1 :(得分:2)

session.query(Thing.id).all()

通常您查询整个对象,但您也可以查询属性

答案 2 :(得分:1)

为了尽可能准确地回答原始问题,您通过使用 with_entities()

获得 id 列表而不是 SQLAlchemy 对象列表
User.query.with_entities(User.id).all()

把它想象成,而不是做一个完整的选择..

SELECT * FROM user

您只选择了您感兴趣的任何领域:

SELECT id FROM user

老实说,你得到的是一个包含 1 个元素的元组列表:

[(7,), (11,), (15,), (21,), (37,)]

所以最终答案是

ids = [id[0] for id in User.query.with_entities(User.id).all()]

答案 3 :(得分:0)

FYI,我回来的列表是以元组的形式出现的,所以我发现做这样的事情很有用。我使用了直接来自SQLACODEGEN的类,但不幸的是,它使用了某种通用数值,也返回了浮点数,因此进行了强制转换。

ids = list(map(lambda x: int(x[0]), \   
session.query(Trgmst.trgmst_id).filter(Trgmst.trgmst_trigger==trigger).all()))

我本来是想做这样的事情。

ids = list(map(lambda x: int(x[0]), \
session.query(Trgmst.trgmst_id).filter(Trgmst.trgmst_trigger==trigger).all()))
return session.query(Trgjob).filter( \
    and_(Trgjob.jobmst_id==jobmst_id, Trgjob.trgmst_id.in_(ids)) \
    ).count() > 0

但是最后却选择了:

return session.query(Trgjob).join(Trgjob.trgmst). \
    filter(Trgjob.jobmst_id==jobmst_id). \
    filter(Trgmst.trgmst_trigger==trigger). \
    count() > 0

这是因为我正在过滤连接文件的属性。

trgmst是从TrgmstTrgjob的关系。

答案 4 :(得分:0)

使用 SQLAlchemy 1.4+,您可以使用 core-style select syntax:

ids = session.execute(select(MyModel.spam).distinct()).all()