SQLAlchemy中的filter和filter_by有什么区别?
任何人都可以解释SQLAlchemy中的filter
和filter_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 == expression
和keyword = 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