SQLAlchemy Core - Utilizzo dei join

In questo capitolo impareremo come usare i join in SQLAlchemy.

L'effetto dell'adesione si ottiene posizionando semplicemente due tabelle in uno dei due file columns clause o il where clausedel costrutto select (). Ora usiamo i metodi join () e outerjoin ().

Il metodo join () restituisce un oggetto join da un oggetto tabella a un altro.

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

Le funzioni dei parametri menzionati nel codice sopra sono le seguenti:

  • right- il lato destro della giunzione; questo è un qualsiasi oggetto Table

  • onclause- un'espressione SQL che rappresenta la clausola ON del join. Se lasciato su Nessuno, tenta di unire le due tabelle in base a una relazione di chiave esterna

  • isouter - se True, esegue il rendering di un LEFT OUTER JOIN, invece di JOIN

  • full - se True, esegue il rendering di un FULL OUTER JOIN, invece di LEFT OUTER JOIN

Ad esempio, il seguente utilizzo del metodo join () risulterà automaticamente in un join basato sulla chiave esterna.

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

Ciò equivale alla seguente espressione SQL:

students JOIN addresses ON students.id = addresses.st_id

Puoi menzionare esplicitamente i criteri di adesione come segue:

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

Se ora costruiamo il costrutto di selezione sottostante usando questo join come -

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

Ciò risulterà nella seguente espressione SQL:

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

Se questa istruzione viene eseguita utilizzando la connessione che rappresenta il motore, verranno visualizzati i dati appartenenti alle colonne selezionate. Il codice completo è il seguente:

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

Quello che segue è l'output del codice precedente:

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