РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
215 of 711 menu

Метод 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-источник запроса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить