【问题标题】:Usage of "aliased" in SQLAlchemy ORMSQLAlchemy ORM 中“别名”的使用
【发布时间】:2011-07-18 00:39:36
【问题描述】:

来自SQLAlchemy ORM Tutorial

对于标量属性,您可以使用 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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-09-17
        • 2020-07-10
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 2017-09-04
        • 2010-11-11
        • 2011-04-09
        • 2018-05-23
        相关资源
        最近更新 更多