在SQLAlchemy中使用OR

我查看了文档 ,我似乎无法find如何在SQLAlchemy中执行OR查询。 我只想做这个查询。

SELECT address FROM addressbook WHERE city='boston' AND (lastname='bulger' OR firstname='whitey') 

应该是这样的

 addr = session.query(AddressBook).filter(City == "boston").filter(????) 

从教程 :

 from sqlalchemy import or_ filter(or_(User.name == 'ed', User.name == 'wendy')) 

SQLAlchemy重载位运算符&|~所以,而不是用or_()和and or_() and_() (如在Bastien的答案中 )难看和难以阅读的前缀语法,你可以使用这些运算符:

 .filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey')) 

请注意,由于按位运算符的优先级,括号不是可选的

所以你的整个查询可能是这样的:

 addr = session.query(AddressBook) \ .filter(AddressBook.city == "boston") \ .filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey')) 

在OR查询组件数量未知的情况下,or_运算符可能很有用。

例如,让我们假设我们正在创build一个REST服务,只有几个可选的filter,如果任何filter返回true,应该返回logging。 另一方面,如果参数未在请求中定义,我们的查询不应该改变。 没有or_函数,我们必须这样做:

 query = Book.query if filter.title and filter.author: query = query.filter((Book.title.ilike(filter.title))|(Book.author.ilike(filter.author))) else if filter.title: query = query.filter(Book.title.ilike(filter.title)) else if filter.author: query = query.filter(Book.author.ilike(filter.author)) 

用or_函数可以重写为:

 query = Book.query not_null_filters = [] if filter.title: not_null_filters.append(Book.title.ilike(filter.title)) if filter.author: not_null_filters.append(Book.author.ilike(filter.author)) if len(not_null_filters) > 0: query = query.filter(or_(*not_null_filters)) 

这真的很有帮助。 这是我对任何给定的表的实现:

 def sql_replace(self, tableobject, dictargs): #missing check of table object is valid primarykeys = [key.name for key in inspect(tableobject).primary_key] filterargs = [] for primkeys in primarykeys: if dictargs[primkeys] is not None: filterargs.append(getattr(db.RT_eqmtvsdata, primkeys) == dictargs[primkeys]) else: return query = select([db.RT_eqmtvsdata]).where(and_(*filterargs)) if self.r_ExecuteAndErrorChk2(query)[primarykeys[0]] is not None: # update filter = and_(*filterargs) query = tableobject.__table__.update().values(dictargs).where(filter) return self.w_ExecuteAndErrorChk2(query) else: query = tableobject.__table__.insert().values(dictargs) return self.w_ExecuteAndErrorChk2(query) # example usage inrow = {'eqmtvs_id': eqmtvsid, 'datetime': dtime, 'param_id': paramid} self.sql_replace(tableobject=db.RT_eqmtvsdata, dictargs=inrow)