Использование "aliased" в 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
но он должен существовать по какой-то причине. Как его использовать? Каковы некоторые хорошие варианты использования?
2 ответов
aliased()
или alias()
используются всякий раз, когда вам нужно использовать SELECT ... FROM my_table my_table_alias ...
построить в SQL, в основном при использовании одной и той же таблицы более одного раза в запросе (самосоединения, с дополнительными таблицами или без них). В некоторых случаях также необходимо использовать псевдонимы подзапросов.
в документации есть пример: http://www.sqlalchemy.org/docs/orm/query.html?highlight=aliased#sqlalchemy.orm.util.AliasedClass
As @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'))