如何获取ID列表而不是SQLAlchemy对象列表? 目前我正在这样做:
[x.id for x in random_query.all()]
有没有更好的方法,最好只使用SQLAlchemy语句。
答案 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()
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
是从Trgmst
到Trgjob
的关系。
答案 4 :(得分:0)
使用 SQLAlchemy 1.4+,您可以使用 core-style select syntax:
ids = session.execute(select(MyModel.spam).distinct()).all()