SQLAlchemy ORM中“aliased”的用法
你可以通过使用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