SQLAlchemy Core: uso de combinaciones
En este capítulo, aprenderemos cómo usar Joins en SQLAlchemy.
El efecto de unión se logra simplemente colocando dos tablas en el columns clause o la where clausede la construcción select (). Ahora usamos los métodos join () y outsidejoin ().
El método join () devuelve un objeto de unión de un objeto de tabla a otro.
join(right, onclause = None, isouter = False, full = False)
Las funciones de los parámetros mencionados en el código anterior son las siguientes:
right- el lado derecho de la unión; este es cualquier objeto Table
onclause- una expresión SQL que representa la cláusula ON de la combinación. Si se deja en Ninguno, intenta unir las dos tablas basándose en una relación de clave externa
isouter - si es Verdadero, muestra una LEFT OUTER JOIN, en lugar de JOIN
full - si es Verdadero, genera un COMPLETO EXTERIOR JOIN, en lugar de LEFT OUTER JOIN
Por ejemplo, el siguiente uso del método join () dará como resultado automáticamente una combinación basada en la clave externa.
>>> print(students.join(addresses))
Esto es equivalente a la siguiente expresión SQL:
students JOIN addresses ON students.id = addresses.st_id
Puede mencionar explícitamente los criterios para unirse de la siguiente manera:
j = students.join(addresses, students.c.id == addresses.c.st_id)
Si ahora construimos la construcción de selección a continuación usando esta combinación como:
stmt = select([students]).select_from(j)
Esto dará como resultado la siguiente expresión SQL:
SELECT students.id, students.name, students.lastname
FROM students JOIN addresses ON students.id = addresses.st_id
Si esta declaración se ejecuta utilizando la conexión que representa el motor, se mostrarán los datos que pertenecen a las columnas seleccionadas. El código completo es el siguiente:
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()
La siguiente es la salida del código anterior:
[
(1, 'Ravi', 'Kapoor'),
(1, 'Ravi', 'Kapoor'),
(3, 'Komal', 'Bhandari'),
(5, 'Priya', 'Rajhans'),
(2, 'Rajiv', 'Khanna')
]