SQLAlchemy Core - 使用连接
在本章中,我们将学习如何在 SQLAlchemy 中使用连接。
只需将两个表放在 select() 构造的 columns 子句 或 where 子句 中即可实现连接的效果。现在我们使用 join() 和 outerjoin() 方法。
join() 方法返回从一个表对象到另一个表对象的连接对象。
join(right, onclause = None, isouter = False, full = False)
上述代码中提到的参数的功能如下 −
right − 连接的右侧;这是任何 Table 对象
onclause − 表示连接的 ON 子句的 SQL 表达式。如果保留为 None,它将尝试基于外键关系连接两个表
isouter − 如果为 True,则呈现 LEFT OUTER JOIN,而不是 JOIN
full − 如果为 True,则呈现 FULL OUTER JOIN,而不是 LEFT OUTER JOIN
例如,以下使用 join() 方法将自动导致基于外键的连接。
>>> print(students.join(addresses))
这相当于以下 SQL 表达式 −
students JOIN address ON students.id = address.st_id
您可以明确提及连接条件,如下所示 −
j = students.join(addresses, students.c.id == address.c.st_id)
如果我们现在使用此连接作为 − 构建以下选择构造
stmt = select([students]).select_from(j)
这将导致以下 SQL 表达式 −
SELECT students.id, students.name, students.lastname FROM students JOIN address ON students.id = address.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') ]