- SQLAlchemy 教程
- SQLAlchemy - 主页
- SQLAlchemy - 简介
- SQLAlchemy 核心
- 表达语言
- 连接到数据库
- 创建表
- SQL 表达式
- 执行表达式
- 选择行
- 使用文本 SQL
- 使用别名
- 使用 UPDATE 表达式
- 使用 DELETE 表达式
- 使用多个表
- 使用多个表更新
- 按参数顺序更新
- 多表删除
- 使用连接
- 使用连词
- 使用函数
- 使用集合运算
- SQLAlchemy ORM
- 声明映射
- 创建会话
- 添加对象
- 使用查询
- 更新对象
- 应用过滤器
- 过滤器运算符
- 返回列表和标量
- 文本SQL
- 建立关系
- 使用相关对象
- 使用连接
- 常见关系运算符
- 急切加载
- 删除相关对象
- 多对多关系
- 方言
- SQLAlchemy 有用资源
- SQLAlchemy - 快速指南
- SQLAlchemy - 有用的资源
- SQLAlchemy - 讨论
SQLAlchemy ORM - 使用连接
现在我们有两个表,我们将了解如何同时在两个表上创建查询。要在 Customer 和 Invoice 之间构建简单的隐式联接,我们可以使用 Query.filter() 将它们的相关列等同在一起。下面,我们使用此方法立即加载客户和发票实体 -
from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind = engine) session = Session() for c, i in session.query(Customer, Invoice).filter(Customer.id == Invoice.custid).all(): print ("ID: {} Name: {} Invoice No: {} Amount: {}".format(c.id,c.name, i.invno, i.amount))
SQLAlchemy 发出的 SQL 表达式如下 -
SELECT customers.id AS customers_id, customers.name AS customers_name, customers.address AS customers_address, customers.email AS customers_email, invoices.id AS invoices_id, invoices.custid AS invoices_custid, invoices.invno AS invoices_invno, invoices.amount AS invoices_amount FROM customers, invoices WHERE customers.id = invoices.custid
上面几行代码的结果如下 -
ID: 2 Name: Gopal Krishna Invoice No: 10 Amount: 15000 ID: 2 Name: Gopal Krishna Invoice No: 14 Amount: 3850 ID: 3 Name: Govind Pant Invoice No: 3 Amount: 10000 ID: 3 Name: Govind Pant Invoice No: 4 Amount: 5000 ID: 4 Name: Govind Kala Invoice No: 7 Amount: 12000 ID: 4 Name: Govind Kala Invoice No: 8 Amount: 8500 ID: 5 Name: Abdul Rahman Invoice No: 9 Amount: 15000 ID: 5 Name: Abdul Rahman Invoice No: 11 Amount: 6000
使用 Query.join() 方法可以轻松实现实际的 SQL JOIN 语法,如下所示 -
session.query(Customer).join(Invoice).filter(Invoice.amount == 8500).all()
连接的 SQL 表达式将显示在控制台上 -
SELECT customers.id AS customers_id, customers.name AS customers_name, customers.address AS customers_address, customers.email AS customers_email FROM customers JOIN invoices ON customers.id = invoices.custid WHERE invoices.amount = ?
我们可以使用 for 循环迭代结果 -
result = session.query(Customer).join(Invoice).filter(Invoice.amount == 8500) for row in result: for inv in row.invoices: print (row.id, row.name, inv.invno, inv.amount)
使用 8500 作为绑定参数,将显示以下输出 -
4 Govind Kala 8 8500
Query.join() 知道如何在这些表之间进行联接,因为它们之间只有一个外键。如果没有外键或更多外键,则使用以下形式之一时 Query.join() 效果更好 -
query.join(发票, id == Address.custid) | 显式条件 |
query.join(客户.发票) | 从左到右指定关系 |
query.join(发票, 客户.发票) | 一样,有明确的目标 |
query.join('发票') | 同样,使用字符串 |
类似地,outerjoin() 函数可用于实现左外连接。
query.outerjoin(Customer.invoices)
subquery() 方法生成一个表示嵌入在别名中的 SELECT 语句的 SQL 表达式。
from sqlalchemy.sql import func stmt = session.query( Invoice.custid, func.count('*').label('invoice_count') ).group_by(Invoice.custid).subquery()
stmt 对象将包含如下 SQL 语句 -
SELECT invoices.custid, count(:count_1) AS invoice_count FROM invoices GROUP BY invoices.custid
一旦我们有了语句,它的Behave就像一个表构造。语句上的列可通过名为 c 的属性访问,如以下代码所示 -
for u, count in session.query(Customer, stmt.c.invoice_count).outerjoin(stmt, Customer.id == stmt.c.custid).order_by(Customer.id): print(u.name, count)
上面的 for 循环按名称显示发票计数,如下所示 -
Arjun Pandit None Gopal Krishna 2 Govind Pant 2 Govind Kala 2 Abdul Rahman 2