Функция aliased
Функция aliased создает псевдоним (alias) для
модели или таблицы. Первым параметром функция принимает
класс модели, вторым - опциональный псевдоним. Это
позволяет обращаться к одной и той же таблице несколько
раз в одном запросе, что особенно полезно при
самосоединениях (self-join) и работе с
иерархическими структурами.
Синтаксис
aliased(element, [alias])
Пример
Давайте создадим модель и получим псевдоним для нее:
<+python+>
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, aliased
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
ArticleAlias = aliased(Article)
print(ArticleAlias)
<-python+>
Результат выполнения кода:
<+python+>
""
<-python+>
Пример
Давайте используем псевдоним в запросе с самосоединением:
<+python+>
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, aliased, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1', text='text 1', status='published', num=1),
Article(title='article 2', text='text 2', status='draft', num=2),
Article(title='article 3', text='text 3', status='published', num=3)
])
session.commit()
a1 = aliased(Article)
a2 = aliased(Article)
stmt = select(a1.title, a2.title).where(
a1.num == a2.num,
a1.id < a2.id
)
res = session.execute(stmt).all()
print(res)
<-python+>
Результат выполнения кода:
<+python+>
[]
<-python+>
Пример
Давайте явно укажем имя псевдонима вторым параметром:
<+python+>
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, aliased
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
ArticleAlias = aliased(Article, name='a')
stmt = select(ArticleAlias.title)
print(stmt)
<-python+>
Итоговый SQL запрос:
SELECT a.title
FROM articles AS a
Смотрите также
-
функцию
select,
которая создает SELECT-запрос -
функцию
with_polymorphic,
которая создает псевдоним для полиморфных моделей -
функцию
union,
которая объединяет результаты запросов -
функцию
exists,
которая создает подзапрос EXISTS