2010-01-24 56 views

回答

229

filter_by用于简单的查询使用常规kwargs列名,像

db.users.filter_by(name='Joe')

同样可以用filter来完成,没有使用kwargs,而是使用“==”等于运算符,已经超载了db.users.name对象:

db.users.filter(db.users.name=='Joe')

你也可以写使用更强大的查询,比如像表达式:

db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))

+16

这是如何工作的? 'db.users.name ==''Ryan''不会评估一次,然后从那以后毫无意义?似乎需要使用lambda来实现此功能。 – 2013-02-27 23:11:28

+30

相等运算符被重载 – 2013-02-27 23:12:21

+2

'type(model.column_name =='asdf')'→'sqlalchemy.sql.elements.BinaryExpression' – 2017-05-22 16:53:49

29

filter_by使用关键字参数,而filter让像filter(User.name=="john")

93

Python的过滤参数实际上,我们这些已经合并在一起,原来,即有一个“过滤器”般的接受* args和** kwargs的方法,您可以在其中传递SQL表达式或关键字参数(或两者)。实际上,我发现这样更方便,但人们总是对此感到困惑,因为他们通常仍在克服column == expressionkeyword = expression之间的差异。所以我们把它们分开。

+23

我认为您关于'column == expression'与'keyword = expression'的观点是关于'filter'和'filter_by'之间的区别的关键点。谢谢! – Hollister 2010-12-12 18:03:29

+0

这是一个很好的相关问题:[http://stackoverflow.com/questions/19506105/flask-sqlalchemy-query-with-keyword-as-variable]。 – Soferio 2014-09-12 14:10:35

+2

我是新来的sqlalchemy,所以如果这是一个愚蠢的问题,但是filter_by()似乎不允许甚至非常简单的条件,例如“price> = 100”。那么,为什么还要使用filter_by()函数,如果你只能用于最简单的条件,比如“price = 100”? – PawelRoman 2014-10-12 20:39:22

23

它是一种快速查询写入的语法糖。它的伪代码实现:

def filter_by(self, **kwargs): 
    return self.filter(sql.and_(**kwargs)) 

并可以简单的写:

Users.query.filter_by(name='Joe', surname='Dodson') 

BTW

db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England')) 

可以写成

db.users.filter((db.users.name=='Ryan') | (db.users.country=='England')) 

你也可以得到对象直接由PK通过get方法:

Users.query.get(123) 
# And even by a composite PK 
Users.query.get(123, 321) 

当使用get情况下,其重要的是,对象可以在不脱离identity map数据库请求,其可被用作高速缓冲存储器(与交易相关联的)被返回

+0

这些代码示例具有误导性:声明式基表类和实例既没有过滤器也没有查询方法;他们使用会话。 – 2016-03-16 19:45:35

+0

我从以前的答案中重现'users.filter'。可能是我的错:) 'query'属性是[query_property](http://docs.sqlalchemy.org/en/latest/orm/contextual.html?highlight=query_property#sqlalchemy.orm.scoping.scoped_session。 query_property)及其相当标准的糖现在 – enomad 2016-03-16 21:47:22

-4

filter()filter_by()之间的不同之处在于前者(filter())的作用类似于​​声明,而filter_by()的作用类似于and (&&)声明。 filter()如果提供的任何参数是True,则评估为true。它将它与等号==进行比较。当且仅当所有提供的参数评估为Truefilter_by()评估True。 因此,在调用每个函数时应小心,因为它们不以相同的方式评估它们的参数。 结帐下面这个例子:

borrowedlist = Borrowedbooks.query.filter_by(bookid = bookid, userid = userid, status = 'false').first() 
     if borrowedlist == None: 
      return None 
     return borrowedlist 

将返回True当且仅当所有提供的参数返回True 同时:

borrowedlist = Borrowedbooks.query.filter(bookid == bookid, userid == userid, status == 'false').first() 
     if borrowedlist == None: 
      return None 
     return borrowedlist 

将返回True如果任何提供的参数计算True

+3

这是完全错误的。 'filter'和'filter_by'都用'and_'连接多个参数。请参阅[过滤器文档](http://docs.sqlalchemy.org/en/rel_1_1/orm/query.html#sqlalchemy.orm.query.Query.filter) – 2017-01-24 23:28:12