如何获取SQLAlchemy查询中实体的类型

2 投票
3 回答
1968 浏览
提问于 2025-04-15 23:48

我知道怎么获取从一个选择语句中返回的列,但我想知道如何从一个sqlalchemy.orm.Query对象中获取将要返回的实体。

>>> sess = Session()
>>> q = sess.query(Entity1, Entity2)
>>> q.statement.c.keys()
['e1_col1', 'e1_col2', ..., 'e2_col1', 'e2_col2, ...]

我想要的是[Entity1, Entity2]或者类似的东西!

3 个回答

-1

sqlalchemy_utils模块里有一个叫做get_query_entities的函数,可以完成这个任务。

https://sqlalchemy-utils.readthedocs.io/en/latest/orm_helpers.html#sqlalchemy_utils.functions.get_query_entities

1

这可以通过 Query.column_descriptions 间接获取:

entities = {item['entity'] for item in query.column_descriptions}

这里使用了集合而不是列表,目的是为了避免在查询特定列时出现重复的情况(比如:query = session.query(Foo.bar, Foo.baz))。column_descriptions 属性会为每个选中的列提供一个条目,因此如果用列表就会导致重复。

3

更新:现在有了更好的方法,可以查看 @exhuma 的回答。以下是我2010年的旧回答。

你可以试试这个:

[e.mapper.class_ for e in q._entities]

虽然我更希望不直接使用 _entities 属性,而是找到其他方式来访问它,但据我所知,似乎没有其他方法。

撰写回答