SQLAlchemy Core - Sử dụng tham gia

Trong chương này, chúng ta sẽ học cách sử dụng Joins trong SQLAlchemy.

Hiệu quả của việc tham gia đạt được chỉ bằng cách đặt hai bảng vào columns clause hoặc là where clausecủa cấu trúc select (). Bây giờ chúng ta sử dụng phương thức join () và externaljoin ().

Phương thức join () trả về một đối tượng nối từ đối tượng bảng này sang đối tượng bảng khác.

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

Chức năng của các tham số được đề cập trong đoạn mã trên như sau:

  • right- phía bên phải của phép nối; đây là bất kỳ đối tượng Table nào

  • onclause- một biểu thức SQL đại diện cho mệnh đề ON của phép nối. Nếu được để ở Không có, nó sẽ cố gắng nối hai bảng dựa trên mối quan hệ khóa ngoài

  • isouter - nếu Đúng, hiển thị THAM GIA TRÁI OUTER, thay vì THAM GIA

  • full - nếu True, hiển thị FULL OUTER JOIN, thay vì LEFT OUTER JOIN

Ví dụ, việc sử dụng phương thức join () sau sẽ tự động dẫn đến phép nối dựa trên khóa ngoại.

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

Điều này tương đương với biểu thức SQL sau:

students JOIN addresses ON students.id = addresses.st_id

Bạn có thể đề cập rõ ràng các tiêu chí tham gia như sau:

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

Nếu bây giờ chúng ta xây dựng cấu trúc chọn bên dưới bằng cách sử dụng phép nối này dưới dạng:

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

Điều này sẽ dẫn đến biểu thức SQL sau:

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

Nếu câu lệnh này được thực thi bằng công cụ biểu diễn kết nối, dữ liệu thuộc các cột đã chọn sẽ được hiển thị. Mã hoàn chỉnh như sau:

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

Sau đây là kết quả của đoạn mã trên:

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