sqlalchemy多表连接查询(左外连接)思路

做任务时有个多表连接查询,在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())
    
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来简单介绍一下如何使用 sqlalchemy 自动运行 MySQL 数据库进行两张表的某一个字段比对,并且如有一致则比中弹屏。 首先,需要安装并配置好 sqlalchemyMySQL 数据库。然后,可以按照以下步骤使用 sqlalchemy 自动运行 MySQL 数据库进行两张表的某一个字段比对: 1. 使用 sqlalchemy 创建两张表的映射类,定义需要比对的字段。 ```python from sqlalchemy import Column, Integer, String, create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Table1(Base): __tablename__ = 'table1' id = Column(Integer, primary_key=True) name = Column(String(50)) age = Column(Integer) class Table2(Base): __tablename__ = 'table2' id = Column(Integer, primary_key=True) name = Column(String(50)) age = Column(Integer) ``` 2. 创建 MySQL 数据库连接和 session。 ```python engine = create_engine('mysql+pymysql://username:password@host:port/database') Session = sessionmaker(bind=engine) session = Session() ``` 3. 查询表1和表2中需要比对的字段。 ```python field = 'name' results1 = session.query(Table1).with_entities(getattr(Table1, field)).all() results2 = session.query(Table2).with_entities(getattr(Table2, field)).all() ``` 4. 将查询结果转化为集合,并计算交集。 ```python set1 = set([result[0] for result in results1]) set2 = set([result[0] for result in results2]) intersection = set1.intersection(set2) ``` 5. 如果交集不为空,则比中弹屏并发出声音。 ```python if intersection: print('Match found!') # 弹屏并发出声音的代码 ``` 需要注意的是,以上代码仅提供思路,实际使用时需要根据具体情况进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值