任何人都可以解释SQLAlchemy中filter
和filter_by
函数之间的区别吗?我很困惑,不能真正看到差异。我应该使用哪一个?SQLAlchemy中的filter和filter_by有什么区别?
回答
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'))
filter_by
使用关键字参数,而filter
让像filter(User.name=="john")
Python的过滤参数实际上,我们这些已经合并在一起,原来,即有一个“过滤器”般的接受* args和** kwargs的方法,您可以在其中传递SQL表达式或关键字参数(或两者)。实际上,我发现这样更方便,但人们总是对此感到困惑,因为他们通常仍在克服column == expression
和keyword = expression
之间的差异。所以我们把它们分开。
我认为您关于'column == expression'与'keyword = expression'的观点是关于'filter'和'filter_by'之间的区别的关键点。谢谢! – Hollister 2010-12-12 18:03:29
这是一个很好的相关问题:[http://stackoverflow.com/questions/19506105/flask-sqlalchemy-query-with-keyword-as-variable]。 – Soferio 2014-09-12 14:10:35
我是新来的sqlalchemy,所以如果这是一个愚蠢的问题,但是filter_by()似乎不允许甚至非常简单的条件,例如“price> = 100”。那么,为什么还要使用filter_by()函数,如果你只能用于最简单的条件,比如“price = 100”? – PawelRoman 2014-10-12 20:39:22
它是一种快速查询写入的语法糖。它的伪代码实现:
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
数据库请求,其可被用作高速缓冲存储器(与交易相关联的)被返回
这些代码示例具有误导性:声明式基表类和实例既没有过滤器也没有查询方法;他们使用会话。 – 2016-03-16 19:45:35
我从以前的答案中重现'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
filter()
和filter_by()
之间的不同之处在于前者(filter()
)的作用类似于声明,而filter_by()
的作用类似于and (&&)
声明。 filter()
如果提供的任何参数是True
,则评估为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
这是完全错误的。 '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
- 1. “git filter-branch”中“--tree-filter”和“--index-filter”有什么区别?
- 2. elasticsearch中Query DSL中must和filter之间有什么区别?
- 3. 在Django filter语句中__exact和等号(=)有什么区别?
- 4. sqlalchemy的数据类型中的Varchar和String有什么区别?
- 5. 有什么区别`和$(Bash中有什么区别?
- 6. $ filter和faceure在天蓝色搜索之间有什么区别
- 7. ==和===有什么区别?
- 8. ==和===有什么区别?
- 9. 有什么区别? :和||
- 10. ==和===有什么区别?
- 11. '=='和'==='有什么区别?
- 12. `&`和`ref`有什么区别?
- 13. 有什么区别:。!和:r!?
- 14. | 0和~~有什么区别?
- 15. Appender和〜有什么区别?
- 16. python中的{}和[]有什么区别?
- 17. 列表中的:::和++有什么区别?
- 18. SQL中的“LIKE”和“=”有什么区别?
- 19. console.log中的和+有什么区别?
- 20. Perl中的'eq'和'=〜'有什么区别?
- 21. Prolog中的'和“有什么区别?
- 22. MATLAB中的{}和[]有什么区别?
- 23. PHP中的 - >和::有什么区别?
- 24. 在SQLAlchemy中,这两个模型有什么区别?
- 25. SQLAlchemy中的分离对象和过期对象有什么区别?
- 26. xtype和别名有什么区别?
- 27. Servlet,Filter和Listener在处理下面的场景时有什么区别?
- 28. XSD中IDREF和IDREFS有什么区别?
- 29. COM中IDispatch和IUnkown有什么区别?
- 30. 在JavaScript中,'\'和'\ n'有什么区别?
这是如何工作的? 'db.users.name ==''Ryan''不会评估一次,然后从那以后毫无意义?似乎需要使用lambda来实现此功能。 – 2013-02-27 23:11:28
相等运算符被重载 – 2013-02-27 23:12:21
'type(model.column_name =='asdf')'→'sqlalchemy.sql.elements.BinaryExpression' – 2017-05-22 16:53:49