如何从Google Cloud Firestore下载大量文档?

时间:2019-01-28 11:31:05

标签: google-cloud-platform google-cloud-firestore google-cloud-datastore

我在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.

3 个答案:

答案 0 :(得分:1)

Cloud Firestore python客户端的get()超时为20秒。尝试分手工作或尝试获取所有文档引用,然后进行迭代。

docs = [snapshot.reference for snapshot in col.get()]
for doc in docs:
        ...

Github issue regarding timeout

答案 1 :(得分:1)

我认为还有另一种方法可以使用gcloud命令行工具工作,这将要求您使用Bucket存储和BigQuery,两者都很容易上手。

  1. 在终端中使用gcloud firetore export function导出集合:
gcloud beta firestore export gs://[BUCKET_NAME] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2]

您的整个集合将被导出到GCS Bucket,其数据格式与通过BigQuery可以读取的Cloud Datastore相同。

  1. GCS Bucket to Bigquery加载数据,导出的Firestore集合将作为表保存在BigQuery中

  2. 使用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。如果您的项目属于免费计划,则需要对其进行升级以每天读取更多文档。