SQLAlchemy Core - Usando Joins

Neste capítulo, aprenderemos como usar Joins no SQLAlchemy.

O efeito da união é alcançado colocando apenas duas tabelas em qualquer columns clause ou o where clauseda construção select (). Agora usamos os métodos join () e outerjoin ().

O método join () retorna um objeto de junção de um objeto de tabela para outro.

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

As funções dos parâmetros mencionados no código acima são as seguintes -

  • right- o lado direito da junção; este é qualquer objeto Tabela

  • onclause- uma expressão SQL que representa a cláusula ON da junção. Se deixado em Nenhum, ele tenta juntar as duas tabelas com base em um relacionamento de chave estrangeira

  • isouter - se True, renderiza LEFT OUTER JOIN, em vez de JOIN

  • full - se True, renderiza um FULL OUTER JOIN, em vez de LEFT OUTER JOIN

Por exemplo, o uso seguinte do método join () resultará automaticamente na junção com base na chave estrangeira.

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

Isso é equivalente à seguinte expressão SQL -

students JOIN addresses ON students.id = addresses.st_id

Você pode mencionar explicitamente os critérios de adesão da seguinte forma -

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

Se agora construirmos a construção de seleção abaixo usando esta junção como -

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

Isso resultará na seguinte expressão SQL -

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

Se esta instrução for executada usando o mecanismo que representa a conexão, os dados pertencentes às colunas selecionadas serão exibidos. O código completo é o seguinte -

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()

A seguir está a saída do código acima -

[
   (1, 'Ravi', 'Kapoor'),
   (1, 'Ravi', 'Kapoor'),
   (3, 'Komal', 'Bhandari'),
   (5, 'Priya', 'Rajhans'),
   (2, 'Rajiv', 'Khanna')
]