Sqlalchemy 简明教程

SQLAlchemy Core - Using Joins

在本章中,我们将学习如何在 SQLAlchemy 中使用连接。

连接的效果只需将两个表放在 select() 构造的 columns clausewhere clause 中即可实现。现在,我们使用 join() 和 outerjoin() 方法。

join() 方法从一个表对象返回一个到另一个表对象的连接对象。

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

上面代码中提到的参数的功能如下:

  1. right - 连接的右侧;这是任何表对象

  2. onclause - 表示连接的 ON 子句的 SQL 表达式。如果保留为 None,它将尝试基于外键关系连接两个表

  3. isouter − 如果为 True,将呈现一个 LEFT OUTER JOIN,而不是 JOIN

  4. full − 如果为 True,将呈现一个 FULL OUTER JOIN,而不是 LEFT OUTER JOIN

例如,join() 方法的以下用法将自动导致基于外键的 join。

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

这等效于以下 SQL 表达式 −

students JOIN addresses ON students.id = addresses.st_id

您可以显式提及 join 条件,如下所示 −

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

如果我们现在使用此 join 构建以下选择构建,则为 −

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