以前(一周前)我与 Firestore 通信的 Python 代码工作得很好。但今天我又开始研究它,它在迭代
collection.stream()
service_account = credentials.Certificate('credential/serviceAccount.json')
firebase_admin.initialize_app(service_account)
firestore_db = firestore.client()
docs = firestore_db.collection("FeatureCollection").stream()
for doc in docs:
print(doc)
时引发错误
for doc in *docs*
错误在
"StreamGenerator" is not iterable "__next__" method not defined on type "DocumentSnapshot"
处引发。
错误是
doc = firestore_db.collection("FeatureCollection").document("geom1").get()
此外,每当我执行文档请求时,例如
# Error
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1721882710.133005 19720588 config.cc:230] gRPC experiments enabled: call_status_override_on_cancellation, event_engine_dns, event_engine_listener, http2_stats_fix, monitoring_experiment, pick_first_new, trace_record_callops, work_serializer_clears_time_cache
I0000 00:00:1721882710.140969 19720588 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported
错误信息“'StreamGenerator' is not iterable”表明你尝试迭代的对象(在本例中为
collection.stream()
的结果)不是可迭代的。尽管它的名称可能暗示了这一点,但
stream()
方法在 Python 的 Firebase Admin SDK 中不返回迭代器。它返回一个
StreamGenerator
,它是一个 grpc 对象,不用于直接迭代。
以下是解决此问题的方法以及可能导致错误“' next ' method not defined on type 'DocumentSnapshot'”消息的原因:
-
使用
get()
获取所有文档:
如果你想从集合中获取所有文档,最简单的方法是使用
get()
方法,它返回
DocumentSnapshot
对象的列表:
python
docs = firestore_db.collection("FeatureCollection").get()
for doc in docs:
print(doc.to_dict())
此代码将:
-
获取
FeatureCollection
集合中的所有文档。 -
迭代检索到的
DocumentSnapshot
对象列表。 -
对于每个文档,打印其数据(作为字典)。
-
使用
stream()
进行流式传输(如果你需要):
stream()
方法用于处理大量文档,你希望避免一次性将所有文档加载到内存中。如果你需要这种流式传输行为,则需要以不同的方式使用它:
python
docs = firestore_db.collection("FeatureCollection").stream()
for doc in docs:
print(doc.to_dict())
在此代码中,我们不直接迭代
docs
。
stream()
方法返回一个生成器,因此
for
循环会为流中的每个文档调用
next()
,有效地逐个处理它们。
关于“' next ' method not defined on type 'DocumentSnapshot'”错误:
此错误表明你正在尝试在一个
DocumentSnapshot
对象上调用
next()
,而它不是迭代器。这可能是因为你试图以类似以下方式直接迭代
DocumentSnapshot
:
doc = firestore_db.collection("FeatureCollection").document("geom1").get()
for field in doc: # 错误:doc 不是可迭代的
print(field)
要访问
DocumentSnapshot
中的字段,你可以使用
to_dict()
将其转换为字典,然后进行迭代,或者使用
get()
方法直接访问字段:
doc = firestore_db.collection("FeatureCollection").document("geom1").get()
# 选项 1:转换为字典
doc_dict = doc.to_dict()
for key, value in doc_dict.items():
print(f"{key}: {value}")
# 选项 2:使用 get() 方法
print(doc.get('fieldName'))
关于日志消息:
你提供的日志消息表明你的 gRPC 库工作正常。
ALT
消息表明 ALTS(应用程序层传输安全)功能在你的平台(如果它不是 Linux 或 Windows)上不可用。但是,除非你专门使用 ALTS,否则它不应该影响你的代码。
请确保你使用的是
firebase-admin
包的最新版本。你可以使用以下命令更新它:
pip install --upgrade firebase-admin
如果你仍然遇到问题,请提供你的 Firebase Admin SDK 版本以及相关代码片段,以便我能够进一步帮助你。
标签:python,google-cloud-firestore,firebase-admin From: 78791481