做任务时有个多表连接查询,在sqlalchemy中,join表示内连接,outerjoin表示外连接,一般用左外连接比较多。因为涉及的表较多,主要是要弄清楚各个表之间的关联关系,连接的时候找对关系。
https://www.cnblogs.com/shengulong/p/8385966.html
参考了上面的博客后,写出了我想要的代码,这里总结一下思路。
找到表之间的关联:
'''根据supplier_id筛选goods_id, 根据goods_id筛选doc_id, 根据doc_id筛选num'''
这里涉及了三个表,分别为A,B,C,其中A表中有id,num值,B表中有doc_id, goods_id, C表中有id, shop_id, shop_supplier_id。
现在找到三个表之间的关联是:
C.id == B.goods_id
B.doc_id == A.id
要执行的查询是,根据给出的supplier_id 和shop_id ,key去筛选出A表中的num值。最终我们要得到的结果是A表的参数num,但是给出的参数条件都在C表中,于是我们得到了这样的关系:
C----->B----->A
在代码中我们要查询的是A,所以A和B关联,B和C关联。注意不要弄错了关联关系,表关联的先后次序也不要写错了,否则会提示说找不到连接的表,也不要使用要查询的表来做连接。
弄错连接表连接关系提示,找不到表提示:
Don't know how to join to <class 'dal.models.B'>;please use an ON clause to more clearly establish the left side of this join
或者使用了要查询的表来做连接,出现非唯一的表:
(Not unique table/alias)
最终 我的代码是:
records = (session.query(A) \
.outerjoin(B, A.id == B.doc_id)\
.outerjoin(C, B.goods_id == C.id)\
.filter(C.shop_id == shop_id) \
.filter(C.shop_supplier_id == supplier_id) \
.filter(A.num.contains(num_key)) \
.all())