Использование «aliased» в SQLAlchemy ORM - PullRequest
12 голосов
/ 18 марта 2011

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

Но оно должно существовать по причине.Как это должно быть использовано?Какие есть хорошие варианты использования?

Ответы [ 2 ]

24 голосов
/ 18 марта 2011

aliased() или alias() используются всякий раз, когда вам нужно использовать конструкцию SELECT ... FROM my_table my_table_alias ... в SQL, в основном при использовании одной и той же таблицы в запросе более одного раза (самостоятельные объединения, с дополнительными таблицами или без них).В некоторых случаях вам также необходимо использовать псевдонимы для подзапросов.

В документации есть пример: http://www.sqlalchemy.org/docs/orm/query.html?highlight=aliased#sqlalchemy.orm.util.AliasedClass

2 голосов
/ 27 марта 2018

Как @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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...