SQLAlchemy Core - Utilisation des jointures

Dans ce chapitre, nous allons apprendre à utiliser les jointures dans SQLAlchemy.

L'effet de la jonction est obtenu en plaçant simplement deux tables dans columns clause ou la where clausede la construction select (). Nous utilisons maintenant les méthodes join () et outerjoin ().

La méthode join () renvoie un objet de jointure d'un objet de table à un autre.

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

Les fonctions des paramètres mentionnés dans le code ci-dessus sont les suivantes -

  • right- le côté droit de la jointure; ceci est n'importe quel objet Table

  • onclause- une expression SQL représentant la clause ON de la jointure. S'il est laissé sur Aucun, il tente de joindre les deux tables en fonction d'une relation de clé étrangère

  • isouter - si True, rend un LEFT OUTER JOIN, au lieu de JOIN

  • full - si True, rend une FULL OUTER JOIN, au lieu de LEFT OUTER JOIN

Par exemple, l'utilisation suivante de la méthode join () entraînera automatiquement une jointure basée sur la clé étrangère.

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

Cela équivaut à suivre l'expression SQL -

students JOIN addresses ON students.id = addresses.st_id

Vous pouvez mentionner explicitement les critères d'adhésion comme suit -

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

Si nous construisons maintenant la construction de sélection ci-dessous en utilisant cette jointure comme -

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

Cela entraînera l'expression SQL suivante -

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

Si cette instruction est exécutée à l'aide du moteur représentant la connexion, les données appartenant aux colonnes sélectionnées seront affichées. Le code complet est le suivant -

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

Ce qui suit est la sortie du code ci-dessus -

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