SQLAlchemy Core - การใช้ Joins

ในบทนี้เราจะเรียนรู้วิธีการใช้ Joins ใน SQLAlchemy

ผลของการเข้าร่วมทำได้โดยการวางสองตารางในไฟล์ columns clause หรือ where clauseของโครงสร้าง select () ตอนนี้เราใช้เมธอด join () และ outerjoin ()

วิธี join () ส่งคืนอ็อบเจ็กต์การรวมจากอ็อบเจ็กต์ตารางหนึ่งไปยังอีกอ็อบเจ็กต์

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

ฟังก์ชันของพารามิเตอร์ที่กล่าวถึงในโค้ดข้างต้นมีดังนี้ -

  • right- ด้านขวาของการเข้าร่วม นี่คือวัตถุตารางใด ๆ

  • onclause- นิพจน์ SQL ที่แสดงถึงส่วนคำสั่ง ON ของการเข้าร่วม หากปล่อยไว้ที่ไม่มีก็จะพยายามรวมตารางทั้งสองตามความสัมพันธ์ของคีย์ต่างประเทศ

  • isouter - ถ้าเป็นจริงให้แสดงการเข้าร่วมด้านนอกด้านซ้ายแทนการเข้าร่วม

  • full - ถ้าเป็นจริงจะแสดงการเข้าร่วมเต็มรูปแบบจากภายนอกแทนที่จะเป็น LEFT OUTER JOIN

ตัวอย่างเช่นการใช้เมธอด join () ต่อไปนี้จะส่งผลให้เข้าร่วมโดยอัตโนมัติตามคีย์ต่างประเทศ

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

สิ่งนี้เทียบเท่ากับนิพจน์ SQL ต่อไปนี้ -

students JOIN addresses ON students.id = addresses.st_id

คุณสามารถกล่าวถึงเกณฑ์การเข้าร่วมอย่างชัดเจนดังต่อไปนี้ -

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

หากตอนนี้เราสร้างโครงสร้างเลือกด้านล่างโดยใช้การเข้าร่วมนี้เป็น -

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

สิ่งนี้จะทำให้เกิดนิพจน์ SQL ตามมา -

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

หากคำสั่งนี้ดำเนินการโดยใช้การเชื่อมต่อที่เป็นตัวแทนของเอ็นจินข้อมูลที่เป็นของคอลัมน์ที่เลือกจะแสดงขึ้น รหัสที่สมบูรณ์มีดังนี้ -

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

ต่อไปนี้เป็นผลลัพธ์ของโค้ดด้านบน -

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