文章内容

2021/5/1 18:57:08,作 者: 黄兵

SQLAlchemy Join查询示例

现在我们有了两个表,我们将看到如何在两个表上同时创建查询。为了在Customer和Invoice之间构造一个简单的隐式联接,我们可以使用query.filter()将它们的相关列等同在一起。下面,我们使用此方法立即加载Customer 和 Invoice 实体:

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

下面是生成的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()的方式查询符合条件结果:

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 = ?

也可以使用outerjoin()实现左外连接:

query.outerjoin(Customer.invoices)


文章来源:SQLAlchemy ORM - Working with Joins

分享到:

发表评论

评论列表