Учебники

Ядро SQLAlchemy — Использование соединений

В этой главе мы узнаем, как использовать соединения в SQLAlchemy.

Эффект объединения достигается простым размещением двух таблиц либо в предложении столбцов, либо в предложении where конструкции select (). Теперь мы используем методы join () и outerjoin ().

Метод join () возвращает объект соединения из одного объекта таблицы в другой.

join(right, onclause = None, isouter = False, full = False)

Функции параметров, упомянутых в приведенном выше коде, следующие:

  • right — правая сторона объединения; это любой объект таблицы

  • onclause — выражение SQL, представляющее предложение ON объединения. Если оставить None, он попытается объединить две таблицы на основе отношения внешнего ключа.

  • isouter — если True, то рендерится ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, а не СОЕДИНЕНИЕ

  • full — если True, рендерит FULL OUTER JOIN вместо LEFT OUTER JOIN

right — правая сторона объединения; это любой объект таблицы

onclause — выражение SQL, представляющее предложение ON объединения. Если оставить None, он попытается объединить две таблицы на основе отношения внешнего ключа.

isouter — если True, то рендерится ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, а не СОЕДИНЕНИЕ

full — если True, рендерит FULL OUTER JOIN вместо LEFT OUTER JOIN

Например, последующее использование метода join () автоматически приведет к объединению на основе внешнего ключа.

>>> print(students.join(addresses))

Это эквивалентно следующему выражению SQL —

students JOIN addresses ON students.id = addresses.st_id

Вы можете явно упомянуть критерии присоединения следующим образом:

j = students.join(addresses, students.c.id == addresses.c.st_id)

Если мы сейчас построим нижеприведенную конструкцию select, используя это соединение как —

stmt = select([students]).select_from(j)

Это приведет к следующему выражению SQL —

SELECT students.id, students.name, students.lastname
FROM students JOIN addresses ON students.id = addresses.st_id

Если этот оператор выполняется с использованием механизма, представляющего соединение, будут отображаться данные, относящиеся к выбранным столбцам. Полный код выглядит следующим образом —

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ForeignKey
engine = create_engine('sqlite:///college.db', echo = True)

meta = MetaData()
conn = engine.connect()
students = Table(
   'students', meta, 
   Column('id', Integer, primary_key = True), 
   Column('name', String), 
   Column('lastname', String), 
)

addresses = Table(
   'addresses', meta, 
   Column('id', Integer, primary_key = True), 
   Column('st_id', Integer,ForeignKey('students.id')), 
   Column('postal_add', String), 
   Column('email_add', String)
)

from sqlalchemy import join
from sqlalchemy.sql import select
j = students.join(addresses, students.c.id == addresses.c.st_id)
stmt = select([students]).select_from(j)
result = conn.execute(stmt)
result.fetchall()

Ниже приведен вывод вышеуказанного кода —