如何在SQLAlchemy中使用filter_by实现不等于条件查询?
解决
query_from_DB函数中不等于条件查询的语法错误问题 首先咱们先理清楚你遇到问题的核心原因:
你用sp_id!="sp-10.1.10.149"这种写法时,一方面Python不允许把带!的表达式作为关键字参数(关键字参数必须是key=value的格式),这直接导致了SyntaxError: non-keyword arg after keyword arg报错;另一方面,你函数里用的SQLAlchemyfilter_by(**filter)方法,本身只支持等于关系的键值对查询,根本不兼容!=这类比较运算符。
下面给你两种可行的修改方案,按需选择:
方案一:重构函数支持灵活查询(推荐)
把函数里的filter_by替换成filter,让函数接收SQLAlchemy的条件表达式作为参数,这样就能支持所有类型的查询条件了:
def query_from_DB(obj, *conditions): DBSession = sessionmaker(bind=engine) session = DBSession() res = session.query(obj).filter(*conditions) session.close() return [x for x in res]
调用的时候直接传入字段的比较表达式:
query_from_DB(Router, Router.sp_id != "sp-10.1.10.149", Router.connectivity == "NO")
这种方式不仅解决了不等于的问题,还能轻松扩展到>、<、like等复杂查询场景,灵活性拉满。
方案二:兼容原调用风格,通过特殊标记处理不等于
如果你想尽量贴近原来的调用习惯,可以在函数内部做逻辑判断,用带前缀的键来标识不等于条件:
def query_from_DB(obj, **filter): DBSession = sessionmaker(bind=engine) session = DBSession() query = session.query(obj) for key, value in filter.items(): if key.startswith('not_'): # 去掉前缀,获取实际字段名 real_column = key[4:] # 映射到模型对应的字段 column = getattr(obj, real_column) query = query.filter(column != value) else: query = query.filter_by(**{key: value}) session.close() return [x for x in query]
调用时用not_前缀标记需要不等于的字段:
query_from_DB(Router, not_sp_id="sp-10.1.10.149", connectivity="NO")
这种方式改动小,适合只需要简单不等于查询的场景,但扩展性不如方案一。
内容的提问来源于stack exchange,提问作者vidyadhar reddy
相关产品推荐
相关产品推荐

