前面一篇介绍了SQLAlchemy的入门,这里我讲讲它的进阶用法,其实主要是通过它来轻松实现一些复杂查询。
SQLAlchemy中的映射关系有四种,分别是一对多、多对一、一对一、多对多。接下来我将详细说明怎样去定义这四种关系,
然后再演示怎样通过这四种关系完成复杂的查询和更新。
http://docs.sqlalchemy.org/en/rel_1_1/orm/query.html
关联查询:
http://docs.sqlalchemy.org/en/rel_1_1/orm/query.html#sqlalchemy.orm.query.Query.join
非常简单的关联查询,外键就一个,系统知道如何去关联:
1
|
session.query(User).join(Address).filter(Address.email == "[email protected]").all()
|
指定ON字段:
1
|
q = session.query(User).join(Address, User.id == Address.user_id)
|
多个join
1 2
|
q = session.query(User).join("orders", "items", "keywords") q = session.query(User).join(User.orders).join(Order.items).join(Item.keywords)
|
子查询JOIN:
1 2 3 4 5
|
address_subq = session.query(Address). filter(Address.email_address == '[email protected]'). subquery()
q = session.query(User).join(address_subq, User.addresses)
|
join from:
1 2 3
|
q = session.query(Address).select_from(User). join(User.addresses). filter(User.name == 'ed')
|
和下面的SQL等价:
1 2 3 4
|
SELECT address.* FROM user JOIN address ON user.id = address.user_id WHERE user.name = :name_1
|
左外连接,指定
isouter=True
,等价于
Query.outerjoin()
:
1 2 3
|
q = session.query(Node). join("children", "children", aliased=True, isouter=True). filter(Node.name == 'grandchild 1')
|