如何获得一个ID列表而不是SQLAlchemy对象列表?当前我正在这样做:
[x.id for x in random_query.all()]
有没有更好的方法来做这件事,最好只使用SQLAlchemy语句。
如何获得一个ID列表而不是SQLAlchemy对象列表?当前我正在这样做:
[x.id for x in random_query.all()]
有没有更好的方法来做这件事,最好只使用SQLAlchemy语句。
SQL
SELECT DISTINCT `id` FROM `table`;
Python
for value in Session.query(Table.id).distinct():
#Do something Append
with_entities()
时,为了尽可能准确地得到原始问题的答案,您将获得ID列表而不是SQLAlchemy对象列表。User.query.with_entities(User.id).all()
SELECT * FROM user
您只需选择您感兴趣的字段:
SELECT id FROM user
[(7,), (11,), (15,), (21,), (37,)]
所以最终答案是:
ids = [id[0] for id in User.query.with_entities(User.id).all()]
with_entities
,因为您正在使用 flask-sqlalchemy,它会自动将模型类映射到查询中。 - snakecharmerbSQLAlchemy Session
有一个名为 scalars 的方法,用于获取不需要映射的值列表。
SQLAlchemy 1.4+ style:
results = Session.scalars(select(Table.id)).all()
SQLAlchemy 旧风格:
results = Session.scalars(Session.query(Table.id)).all()
results = Session.scalars(Table.query.with_entities(Table.id)).all()
实际 结果
:
[1, 2, 3, 4, 5]
session.query(Thing.id).all()
使用SQLAlchemy 1.4+,你可以使用核心风格的选择语法:
ids = session.execute(select(MyModel.spam).distinct()).all()
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
是从 Trgjob
到 Trgmst
的关系。
[x.id for x in random_query.all()]
和[x.id for x in random_query.distinct()]
之间究竟有什么区别? - JelteFquery(Table.id).distinct()
。.distinct()
通过使用我上面的 SQL 语句返回仅具有唯一性的结果。如果你的 id 列被定义为主键,则它本身就是唯一的。但是,如果不是,则.all()
可能会多次返回多个 id。 - 1478963for value, in session.query(Table.id).distinct():
来解决这个问题。 - wizzwizz4