繁体   English   中英

在SQLAlchemy ORM中使用“别名”

[英]Usage of “aliased” in SQLAlchemy ORM

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

但它必须存在是有原因的。 该如何使用? 什么是好用例?

无论何时需要在SQL中使用SELECT ... FROM my_table my_table_alias ...构造,都会使用aliased()alias() ,主要是在查询中多次使用同一个表时(自连接,有或没有额外的)表)。 在某些情况下,您还需要对子查询进行别名。

文档中有一个例子: http//www.sqlalchemy.org/docs/orm/query.html?highlight = aliased #sqlalchemy.orm.util.AliasedClass

作为@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'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM