我正在尝试像这样访问 Firestore 中的文档:
from google.cloud import firestore
def check_stuff(document_id, update_time):
firestore_client = firestore.Client()
doc_ref = firestore_client.collection(u'TestCollection').document(document_id)
print(f"Ref OK")
document = doc_ref.get()
print(f"Doc OK")
if document.exists:
return True
else:
return False
它打印第一个打印(“Ref OK”),但不打印下一个。相反,我收到了这个错误,我不太明白。我似乎来自 get() 函数本身:
/[POST] 回溯上的异常(最近一次调用最后一次):文件“/layers/google.python.pip/pip/lib/python3.7/site-packages/flask/app.py”,第 2073 行,在 wsgi_app 中响应 = self.full_dispatch_request() 文件“/layers/google.python.pip/pip/lib/python3.7/site-packages/flask/app.py”,第 1518 行,full_dispatch_request rv = self.handle_user_exception(e)文件“/layers/google.python.pip/pip/lib/python3.7/site-packages/flask/app.py”,第 1516 行,在 full_dispatch_request rv = self.dispatch_request() 文件“/layers/google.python .pip/pip/lib/python3.7/site-packages/flask/app.py”,第1502行,在dispatch_request中返回self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)文件“ /layers/google.python.pip/pip/lib/python3.7/site-packages/functions_framework/init.py”,第 171 行,在 view_func 函数(数据,上下文)文件“/workspace/main.py”中,第 110 行,在 main check = check_stuff(document_id, update_time) 文件“/workspace/main.py”中,第 87 行,在 check_stuff document = document_ref.get() 文件“/layers/google.python.pip/pip/lib” /python3.7/site-packages/google/cloud/firestore_v1/document.py”,第 370 行,在获取数据 = _helpers.decode_dict(document_pb.fields, self._client) 文件“/layers/google.python.pip/ pip/lib/python3.7/site-packages/google/cloud/firestore_v1/_helpers.py”,第 318 行,decode_dict 中返回 {key:decode_value(value, client) for key, value in value_fields.items()} 文件“/layers/google.python.pip/pip/lib/python3.7/site-packages/google/cloud/firestore_v1/_helpers.py”,第 318 行,返回 {key:decode_value(value, client) for key, value_fields.items()} 文件“/layers/google.python.pip/pip/lib/python3.7/site-packages/google/cloud/firestore_v1/_helpers.py”,第 276 行,decode_value value_type = value ._pb.WhichOneof("value_type") 属性错误:_pb
我检查了该集合以及其中的文档是否确实存在。这里没问题。
我的代码位于 Google Cloud Function 上,由 Firestore 触发器调用(
write
在同一文档上触发器)。该代码可以在我的机器上本地运行,但不能在 GCP 上运行。并不是每次都会失败。似乎只有特定的 document_id 才会失败(即使它们存在)。
Python 是 3.7 且 google-cloud-firestore==2.0.1
试试这个:
from google.cloud import firestore
def check_stuff(document_id, update_time):
db = firestore.Client()
doc_ref = db.collection(u'TestCollection').document(u'{document_id}')
print(f"Ref OK")
document_status = doc_ref.get()
print(f"Doc OK")
if document.exists:
return True
else:
return False
尝试使用 .where 和过滤器查询
https://cloud.google.com/firestore/docs/query-data/listen
或获取此参考
# Create an Event for notifying main thread.
callback_done = threading.Event()
# Create a callback on_snapshot function to capture changes
def on_snapshot(doc_snapshot, changes, read_time):
for doc in doc_snapshot:
print(f'Received document snapshot: {doc.id}')
callback_done.set()
doc_ref = db.collection(u'cities').document(u'SF')
# Watch the document
doc_watch = doc_ref.on_snapshot(on_snapshot)
遇到同样的问题。
阻塞 get() 函数。 尝试设置超时,但没有改善...
你解决了吗?