SQLAlchemy Core - używanie połączeń
W tym rozdziale nauczymy się, jak używać połączeń w SQLAlchemy.
Efekt połączenia uzyskuje się po prostu umieszczając dwie tabele w pliku columns clause albo where clausekonstrukcji select (). Teraz używamy metod join () i externaljoin ().
Metoda join () zwraca obiekt join z jednego obiektu tabeli do drugiego.
join(right, onclause = None, isouter = False, full = False)
Funkcje parametrów wymienionych w powyższym kodzie są następujące -
right- prawa strona połączenia; to jest dowolny obiekt tabeli
onclause- wyrażenie SQL reprezentujące klauzulę ON w złączeniu. W przypadku pozostawienia opcji Brak próbuje połączyć dwie tabele na podstawie relacji klucza obcego
isouter - jeśli True, renderuje LEFT OUTER JOIN zamiast JOIN
full - jeśli True, renderuje FULL OUTER JOIN zamiast LEFT OUTER JOIN
Na przykład użycie metody join () automatycznie spowoduje złączenie na podstawie klucza obcego.
>>> print(students.join(addresses))
Jest to równoważne z następującym wyrażeniem SQL -
students JOIN addresses ON students.id = addresses.st_id
Możesz wyraźnie wspomnieć o kryteriach dołączania w następujący sposób -
j = students.join(addresses, students.c.id == addresses.c.st_id)
Jeśli teraz zbudujemy poniższą konstrukcję wybierz, używając tego sprzężenia jako -
stmt = select([students]).select_from(j)
Spowoduje to następujące wyrażenie SQL -
SELECT students.id, students.name, students.lastname
FROM students JOIN addresses ON students.id = addresses.st_id
Jeśli instrukcja ta zostanie wykonana przy użyciu połączenia reprezentującego silnik, wyświetlone zostaną dane należące do wybranych kolumn. Kompletny kod wygląda następująco -
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()
Poniżej przedstawiono wynik powyższego kodu -
[
(1, 'Ravi', 'Kapoor'),
(1, 'Ravi', 'Kapoor'),
(3, 'Komal', 'Bhandari'),
(5, 'Priya', 'Rajhans'),
(2, 'Rajiv', 'Khanna')
]