我在Google Cloud Firestore中有一个收藏集data
。该馆藏有20万多个文档。我想将每个文档作为一行导出到文件中。
我创建了一个脚本,该脚本可以很好地用于5万行。在那之后它崩溃与以下异常。如何获取所有文件?
我看到了一种叫做偏移的东西,但是不确定它对我的情况有帮助。
代码段:
from google.cloud import firestore
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "key.json"
db = firestore.Client()
col = db.collection(u'data')
docs = col.get()
with open('data.bak', 'a') as f:
for doc in docs:
f.write(u'{} => {}'.format(doc.id, doc.to_dict()))
f.write('\n')
例外:
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "down_db.py", line 13, in <module>
for doc in docs:
File "/usr/local/lib/python3.6/dist-packages/google/cloud/firestore_v1beta1/query.py", line 744, in get
for index, response_pb in enumerate(response_iterator):
File "/usr/local/lib/python3.6/dist-packages/google/api_core/grpc_helpers.py", line 81, in next
six.raise_from(exceptions.from_grpc_error(exc), exc)
File "<string>", line 3, in raise_from
google.api_core.exceptions.ServiceUnavailable: 503 The datastore operation timed out, or the data was temporarily unavailable.
答案 0 :(得分:1)
Cloud Firestore python客户端的get()
超时为20秒。尝试分手工作或尝试获取所有文档引用,然后进行迭代。
docs = [snapshot.reference for snapshot in col.get()]
for doc in docs:
...
答案 1 :(得分:1)
我认为还有另一种方法可以使用gcloud命令行工具工作,这将要求您使用Bucket存储和BigQuery,两者都很容易上手。
gcloud beta firestore export gs://[BUCKET_NAME] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2]
您的整个集合将被导出到GCS Bucket,其数据格式与通过BigQuery可以读取的Cloud Datastore相同。
从GCS Bucket to Bigquery加载数据,导出的Firestore集合将作为表保存在BigQuery中
使用select * from [TABLE_NAME]
之类的查询形式查询BigQuery表,然后BigQuery可以选择将查询结果下载为CSV
答案 2 :(得分:0)
我创建了一个脚本,该脚本可以很好地用于5万行。
该限制恰好是Firebase的number of documents that you can read on a project on the free/Spark plan。如果您的项目属于免费计划,则需要对其进行升级以每天读取更多文档。