SQLAlchemy从查询中获取id列表

Jel*_*teF 7 python sqlalchemy

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

[x.id for x in random_query.all()]
Run Code Online (Sandbox Code Playgroud)

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

ssc*_*lvo 7

为了尽可能准确地回答原始问题,您可以通过使用获得 ids 列表而不是 SQLAlchemy 对象列表with_entities()

User.query.with_entities(User.id).all()
Run Code Online (Sandbox Code Playgroud)

将其视为,而不是进行完整选择..

SELECT * FROM user
Run Code Online (Sandbox Code Playgroud)

您只选择您感兴趣的领域:

SELECT id FROM user
Run Code Online (Sandbox Code Playgroud)

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

[(7,), (11,), (15,), (21,), (37,)]
Run Code Online (Sandbox Code Playgroud)

所以最终的答案是

ids = [id[0] for id in User.query.with_entities(User.id).all()]
Run Code Online (Sandbox Code Playgroud)


Iva*_*vas 7

SQLAlchemySession具有用于获取值列表而无需映射的方法标量。

SQLAlchemy 1.4+ style:
results = Session.scalars(select(Table.id)).all()
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy 旧样式:

results = Session.scalars(Session.query(Table.id)).all()
results = Session.scalars(Table.query.with_entities(Table.id)).all()
Run Code Online (Sandbox Code Playgroud)

实际的results

[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)


147*_*963 6

SQL

 SELECT DISTINCT `id` FROM `table`;
Run Code Online (Sandbox Code Playgroud)

蟒蛇

 for value in Session.query(Table.id).distinct():
     #Do something Append
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,是的,有效.我唯一的问题是它返回一个元组列表,其中只有id. (3认同)
  • `[x.id for x in random_query.all()]`和`[x.id for x in random_query.distinct()]`之间究竟有什么区别? (2认同)
  • `query(Table.id).distinct()` 就是你要找的。.distinct() 确实返回的结果只有使用我上面的 SQL 语句才不同。如果您的 id 列被定义为主键,那么它的定义是不同的。但是,如果不是,则 .all() 可能会不止一次返回多个 id。 (2认同)