В этой главе мы узнаем, как использовать соединения в 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()
Ниже приведен вывод вышеуказанного кода —