SQLAlchemy ORM中“aliased”的用法

27 投票
2 回答
71240 浏览
提问于 2025-04-16 13:57

来自SQLAlchemy ORM 教程

你可以通过使用label()这个构造来控制标量属性的名称,而对于类构造则使用aliased:

>>> 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

不过这样做肯定是有原因的。那么应该怎么使用呢?有哪些好的使用场景呢?

2 个回答

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'))
42

aliased()alias() 是在你需要使用 SQL 中的 SELECT ... FROM my_table my_table_alias ... 这种写法时用到的,特别是当你在一个查询中多次使用同一张表的时候(比如自连接,可能会有其他表也参与)。在某些情况下,你还需要给子查询起别名。

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

撰写回答