SQLAlchemy or_的使用

1、参考https://blog.csdn.net/qq_34989829/article/details/111545430

https://blog.csdn.net/weixin_44737199/article/details/94215679

2、代码

master = aliased(MasterInfo, name='a')
detail = aliased(DetailInfo, name='b')
query = db.session.query(master)
query = query.filter((now >= master.BEGINDATE) & (now <= master.ENDDATE))
if hasattr(body, 'TYPE') and body.TYPE:
	query = query.filter(or_(master.TYPE == body.type, master.type == '全部'))

query = (query
		 .outerjoin(detail, master.ID == detail.MASTERID)
		 )
or_filter = []
if hasattr(body, 'DST') and body.DST and hasattr(body, 'AST') and body.AST:
	or_filter.append(and_((master.RELATION == 2),
						  (detail.DST == body.DST) &
						  (detail.AST == body.AST)
						  )
					 )
if hasattr(body, 'NAME') and body.NAME:
	or_filter.append(and_((master.RELATION == 3),
						  (detail.NAME == body.NAME)
						  )
					 )

if hasattr(body, 'APS') and body.APS:
	ap_list = body.APS.split(',')
	if ap_list:
		or_filter.append(and_((master.APS == 1),
							  (detail.APS.in_(ap_list))
							  )
						 )
if or_filter:
	query = query.filter(or_(*or_filter))
query = query.order_by(master.CREATEDATE)
items = query.all()

3、生成的SQL如下:

SELECT ...
FROM [MASTER_INFO] AS a 
LEFT OUTER JOIN [DETAIL_INFO] AS b 
ON a.[ID] = b.[MASTERID] 
WHERE a.[BEGINDATE] <= %(BEGINDATE_1)s 
AND a.[ENDDATE] >= %(ENDDATE_1)s 
AND (a.[TYPE] = %(TYPE_1)s OR a.[TYPE] = %(TYPE_2)s) 
AND (
(a.[RELATION] = %(RELATION_1)s AND b.[DST] = %(DST_1)s AND b.[AST] = %(AST_1)s)
OR a.[RELATION] = %(RELATION_2)s AND b.[NAME] = %(NAME_1)s 
OR a.[RELATION] = %(RELATION_3)s AND b.[APS] IN (__[POSTCOMPILE_APS_1])
) 
ORDER BY a.[CREATEDATE]

4、sql中and和or的优先级, and的优先级大于or,通俗理解其实or查询其实会把条件分为左右两边来查,python中and和or的优先级也类似,所以or后面的不再需要括号提高优先级。 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在FastAPI中使用SQLAlchemy的or_函数可以用于构建复杂的查询条件,它允许我们在查询中使用多个条件之间的逻辑或关系。 首先,我们需要导入SQLAlchemy的or_函数: ```python from sqlalchemy import or_ ``` 然后,我们可以在查询中使用or_函数来构建多个条件之间的逻辑或关系。下面是一个示例: ```python from fastapi import FastAPI from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base app = FastAPI() # 创建数据库连接 engine = create_engine("sqlite:///test.db") SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() # 定义模型类 class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) name = Column(String, index=True) age = Column(Integer) # 创建数据库表 Base.metadata.create_all(bind=engine) @app.get("/users") def get_users(name: str = None, age: int = None): db = SessionLocal() query = db.query(User) if name: query = query.filter(User.name == name) if age: query = query.filter(User.age == age) # 使用or_函数构建多个条件之间的逻辑或关系 if name and age: query = query.filter(or_(User.name == name, User.age == age)) users = query.all() return users ``` 在上面的示例中,我们定义了一个GET请求的路由`/users`,可以通过查询参数`name`和`age`来过滤用户列表。如果同时提供了`name`和`age`,则使用or_函数构建多个条件之间的逻辑或关系。 相关问题: 1. FastAPI是什么? 2. 什么是SQLAlchemy? 3. SQLAlchemy中的or_函数有什么作用? 4. 还有其他类似的逻辑运算函数吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值