Метод join_from
Метод join_from класса Select выполняет
объединение таблиц с явным указанием левой таблицы. Первым параметром
метод принимает левую таблицу или модель, вторым параметром - правую
таблицу или модель, третьим - условие объединения. В отличие от метода
join, который определяет левую
таблицу автоматически, метод join_from позволяет задать ее явно.
Синтаксис
select(...).join_from(left, right, onclause)
Пример
Давайте создадим две модели и выполним объединение через
метод join_from:
from sqlalchemy import create_engine, select, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
query = select(Article.title, User.title).join_from(
Article, User, Article.user_id == User.id
)
res = session.execute(query).all()
print(res)
Результат выполнения кода:
[]
Пример
Давайте заполним таблицы данными и снова выполним запрос:
from sqlalchemy import create_engine, select, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
user = User(id=1, title='user')
article = Article(id=1, title='article', user_id=1)
session.add_all([user, article])
session.commit()
query = select(Article.title, User.title).join_from(
Article, User, Article.user_id == User.id
)
res = session.execute(query).all()
print(res)
Результат выполнения кода:
[('article', 'user')]
Пример
Давайте посмотрим итоговый SQL-запрос, который генерирует
метод join_from:
from sqlalchemy import create_engine, select, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
query = select(Article.title, User.title).join_from(
Article, User, Article.user_id == User.id
)
print(query)
Итоговый SQL запрос:
SELECT articles.title, users.title
FROM articles JOIN users ON articles.user_id = users.id
Смотрите также
-
класс
Select,
который представляет SELECT-запрос -
метод
join,
который выполняет объединение таблиц -
метод
outerjoin,
который выполняет внешнее объединение таблиц -
метод
select_from,
который задает FROM-источник запроса