有人能解释一下SQLAlchemy中filter和filter_by函数之间的区别吗? 我应该用哪一个?
当前回答
Filter_by用于使用常规kwargs对列名进行简单查询,例如
分贝。\用户filter_by (name =“乔”)。
同样可以用filter实现,不用kwargs,而是使用'=='相等操作符,该操作符已在db.users.name对象上重载:
db.users.filter (db.users.name = =“乔”)
你也可以使用过滤器编写更强大的查询,比如表达式:
db.users.filter (or_ (db.users.name = =“瑞恩”,db.users.country = =“英格兰”))
其他回答
它是一种语法糖,用于更快地编写查询。它在伪代码中的实现:
def filter_by(self, **kwargs):
return self.filter(sql.and_(**kwargs))
对于AND,你可以简单地写:
session.query(db.users).filter_by(name='Joe', surname='Dodson')
btw
session.query(db.users).filter(or_(db.users.name=='Ryan', db.users.country=='England'))
可以写成
session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England'))
你也可以通过get方法直接通过PK获取对象:
Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)
当使用get case时,重要的是对象可以从身份映射中返回,而不需要数据库请求,可以用作缓存(与事务关联)
实际上,我们最初将这些合并在一起,即有一个类似“过滤器”的方法,接受*args和**kwargs,在那里您可以传递一个SQL表达式或关键字参数(或两者)。实际上,我发现这样更方便,但人们总是对它感到困惑,因为他们通常仍然无法理解column == expression和keyword = expression之间的区别。所以我们把它们分开。
filter_by使用关键字参数,而filter允许python式过滤参数,如filter(User.name=="john")
Filter_by用于使用常规kwargs对列名进行简单查询,例如
分贝。\用户filter_by (name =“乔”)。
同样可以用filter实现,不用kwargs,而是使用'=='相等操作符,该操作符已在db.users.name对象上重载:
db.users.filter (db.users.name = =“乔”)
你也可以使用过滤器编写更强大的查询,比如表达式:
db.users.filter (or_ (db.users.name = =“瑞恩”,db.users.country = =“英格兰”))
除了之前发布的所有技术信息外,filter()和filter_by()在可用性方面存在显著差异。
第二个参数filter_by()只能用于筛选特定的内容——字符串或某个数字值。所以它只能用于类别筛选,而不能用于表达式筛选。
另一方面,filter()允许使用比较表达式(==,<,>等),所以当需要进行“小于/大于”过滤时,它很有帮助。但也可以像filter_by()一样使用(当使用==时)。
记住这两个函数的参数类型有不同的语法。
推荐文章
- 如何删除Python中的前导空白?
- python中的assertEquals和assertEqual
- 如何保持Python打印不添加换行符或空格?
- 为什么Python的无穷散列中有π的数字?
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?
- 计数唯一的值在一列熊猫数据框架像在Qlik?
- 使用Pandas将列转换为行
- 从matplotlib中的颜色映射中获取单个颜色
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?