关于使用位置参数进行过滤的 Firestore 警告。如何在 Firestore 查询中使用'filter' kwarg?
Firestore开始显示
UserWarning: Detected filter using positional arguments. Prefer using the 'filter' keyword argument instead.
当使用query.where(field_path, op_string, value)
时,它是官方文档中的方法,https://cloud.google.com/firestore/docs/query-data/queries。
那么,我们应该如何使用 "filter"这个术语呢?找不到这方面的文档或样本。
UPDATE:在GitHub上有一个关于这个问题的公开问题https://github.com/googleapis/python-firestore/issues/705(谷歌的人没有任何反应)。
更新2:所以,基本上,它应该是这样的
from google.cloud.firestore import CollectionReference
from google.cloud.firestore_v1.base_query import FieldFilter, BaseCompositeFilter
...
conditions = [[field, operator, value], [field, operator, value], ...]
query = CollectionReference(path1, path2, path3, ...)
query = query.where(filter=BaseCompositeFilter('AND', [FieldFilter(*_c) for _c in conditions]))
对于一个FieldFilter操作符,通常==,!=等工作,如这里所规定的 https://firebase.google.com/docs/firestore/query-data/queries#query_operators 。
你也可以用'OPERATOR_UNSPECIFIED'代替'AND',但我不确定它是否能起到我认为应该起到的作用 https://firebase.google.com/docs/firestore/reference/rest/v1/StructuredQuery#Operator 。
filter
都被传递时,它就会被提出来;
- zetyquickly 2023-04-28
根据@Robert G
的出色的回答,你可以通过一个半小的调整来摆脱这个警告。
代替:
query = collection_ref
query = query.where(field, op, value)
用这个:
from google.cloud.firestore_v1.base_query import FieldFilter
query = collection_ref
query = query.where(filter=FieldFilter(field, op, value))
然后警告就消失了。希望这有帮助
正如之前在评论中发布的,目前在Github中发布了一个持续的问题。对于那些遇到类似问题的人来说,他们可以查看这个Github链接,了解关于这个问题的更新。
此外,你也可以申请一个bug,这样谷歌的开发人员/工程师也可以对此进行检查,并提供即时的解决方案/修复。
你可以通过这些链接提交一个bug:
我希望这对你有帮助。
对于那些在数据存储变体上有同样问题的人,你可以这样做来摆脱这个错误:
filters = [('property', '=', 'val')]
query = client.query(kind='MyKind', filters=filters)
这确实是有记录的,但不在在线文档中。它可以在内省中找到 datastore > client.py , 809行
UserWarning
。
- Banty 2023-05-31