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')
]