Search code examples
pythonormsqlalchemy

Usage of "aliased" in SQLAlchemy ORM


From the SQLAlchemy ORM Tutorial:

You can control the names using the label() construct for scalar attributes and aliased for class constructs:

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

This seems to be a lot more typing and a lot less readable than the plain class-instrumented descriptors:

>>> for row in session.query(User, User.name).all(): 
...    print row.User, row.name

But it must exist for a reason. How should it be used? What are some good use cases?


Solution

  • aliased() or alias() are used whenever you need to use the SELECT ... FROM my_table my_table_alias ... construct in SQL, mostly when using the same table more than once in a query (self-joins, with or without extra tables). You also need to alias subqueries in certain cases.

    There's an example in the documentation: https://docs.sqlalchemy.org/en/20/orm/queryguide/api.html#sqlalchemy.orm.aliased