SQLAlchemy中的filter和filter_by有什么区别?

任何人都可以解释SQLAlchemy中的filterfilter_by函数之间的区别吗? 我很困惑,不能真正看到差异。 我应该使用哪一个?

filter_by用于使用常规kwargs对列名进行简单查询,如

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

使用filter可以实现同样的function,不使用kwargs,而是使用已经在db.users.name对象上重载的“==”等号运算符:

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

您还可以使用filter编写更强大的查询,例如以下expression式:

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

我们实际上已经把它们合并在一起了,也就是说,有一种类似“filter”的方法接受* args和** kwargs,你可以在那里传递一个SQLexpression式或者关键字参数(或者两者都有)。 实际上,我发现这样做更方便,但人们总是对它感到困惑,因为它们通常还是会越过column == expressionkeyword = expression之间的区别。 所以我们把它们分开

filter_by使用关键字参数,而filter允许filter(User.name=="john")过滤参数,如filter(User.name=="john")

这是用于更快查询写入的语法糖。 它的伪代码实现:

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

对于你可以简单地写:

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

顺便说一句

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

可以写成

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

你也可以通过get方法直接获得对象:

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

在使用get case的时候,重要的是它可以返回没有数据库请求的对象,可以用作caching(与事务相关)

filter()filter_by()之间的区别在于前者( filter() )的作用类似于or (||)语句, filter_by()作用类似于and (&&)语句。 如果提供的任何参数为True filter()计算true。 它将它与等号==相比较。 当且仅当所有提供的参数的计算结果为True filter_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