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