2
votes

Comment télécharger un grand nombre de documents depuis Google Cloud Firestore?

J'ai une collection de données dans Google cloud Firestore. Cette collection contient plus de 200 000 documents. Je veux exporter chaque document sous forme de ligne vers un fichier.

J'ai créé un script qui fonctionne bien pour 50K lignes. Après cela, son crash avec l'exception suivante. Comment puis-je obtenir tous les documents?

J'ai vu quelque chose appelé offset, mais je ne suis pas sûr que cela aide dans ma situation.

Extrait de code:

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.


5 commentaires

Que diriez-vous de charger des données par petits morceaux?


Je n'insère pas de données dans Firestore, mais je les télécharge. Je n'ai aucun contrôle sur la limitation des données ou les clauses where.


C'est aussi ce dont je parle, télécharger des données par petits morceaux. Oh, tu as. Vérifiez ceci .


Merci @AlexMamo, je vais essayer ça. J'essaierai plus tard les curseurs de requête


Copie possible de Pourquoi tous mes documents ne sont-ils pas mis à jour dans Firestore?


3 Réponses :


0
votes

1 commentaires

Merci @Frank van Puffelen. J'utilise le projet cloud Firestore de Google. Qui a des crédits de 300 $ et je suppose que les limites de ligne ne s'appliquent pas aux projets GCP.



3
votes

Le client python Cloud Firestore dispose d'un délai de 20 secondes pour get () . Essayez de diviser le travail ou essayez de récupérer toutes les références de document, puis d'itérer.

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

Problème Github concernant le délai d'expiration a >


0 commentaires

2
votes

Il existe une autre approche qui, je pense, fonctionnerait avec l'outil de ligne de commande gcloud, cela vous obligera à utiliser le stockage Bucket et BigQuery, les deux sont assez faciles à mettre en œuvre.

  1. Exportez les collections à l'aide de la fonction d'exportation gcloud firetore dans le terminal:
gcloud beta firestore export gs://[BUCKET_NAME] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2]

Toutes vos collections seront exportées vers un bucket GCS, le format de données est le même que celui de Cloud Datastore, il est lisible via BigQuery donc ..

  1. Chargez les données du GCS Bucket vers Bigquery a>, la collection Firestore exportée vivra sous forme de tableau dans BigQuery

  2. Interrogez le formulaire de table BigQuery avec quelque chose comme select * from [TABLE_NAME] , BigQuery a alors une option pour télécharger le résultat de la requête au format CSV


0 commentaires