在 SQLAlchemy ORM 中使用“别名”

问题描述 投票:0回答:2

来自 SQLAlchemy ORM 教程

您可以使用标量属性的 label() 构造和类构造的别名来控制名称:

>>> from sqlalchemy.orm import aliased
>>> user_alias = aliased(User, name='user_alias')
>>> for row in session.query(user_alias, user_alias.name.label('name_label')).all(): 
...    print row.user_alias, row.name_label

这似乎比普通的类检测描述符需要更多的打字和更少的可读性:

>>> for row in session.query(User, User.name).all(): 
...    print row.User, row.name

但它的存在一定是有原因的。应该如何使用呢?有哪些好的用例?

python orm sqlalchemy
2个回答
42
投票
每当您需要在 SQL 中使用

aliased()

 构造时,都会使用 
alias()
SELECT ... FROM my_table my_table_alias ...
,主要是在查询中多次使用同一个表时(自联接,有或没有额外的表)。在某些情况下,您还需要为子查询添加别名。

文档中有一个示例:https://docs.sqlalchemy.org/en/20/orm/queryguide/api.html#sqlalchemy.orm.aliased


14
投票

作为@jd。也就是说,主要是在查询中多次使用同一个表时。 示例:

    dict_code_type, dict_code_status = aliased(DictCode), aliased(DictCode)
    query = Device.query \
      .join(dict_code_type, dict_code_type.codeValue == Device.deviceType) \
      .join(dict_code_status, dict_code_status.codeValue == Device.status) \
      .with_entities(Device.id, Device.deviceName, Device.status,
                   Device.deviceID, Device.deviceUsername, Device.token,
                   dict_code_type.codeLabel.label('deviceTypeLabel'),
                   dict_code_status.codeLabel.label('statusLabel'),  Device.createAt, Device.authType) \
    .filter(and_(dict_code_type.code == 'deviceType', dict_code_status.code == 'status'))
© www.soinside.com 2019 - 2024. All rights reserved.