2017-10-05 6 views
0

Je dois écrire un ensemble de résultats à partir de MySQL au format csv dans un compartiment de Google Cloud Storage.Ecriture du résultat MySQL dans un fichier CSV dans Google Cloud Storage

En suivant les instructions here, j'ai créé le code exemple suivant:

import cloudstorage 
from google.appengine.api import app_identity 
import db # My own Mysql wrapper 

dump = db.get_table_dump(schema) # Here I made a simples SQL SELECT and fetchall() 
bucket_name = app_identity.get_default_gcs_bucket_name() 
file_name = "/" + bucket_name + "/finalfiles/" + schema + "/" +"myfile.csv" 
with cloudstorage.open(file_name, "w") as gcsFile: 
    gcsFile.write(dump) 

Il ne fonctionne pas parce que write attend un paramètre de chaîne et dump est tuple de tuples résultent de fetchall().

Je ne peux pas utiliser this approach (ou similaire) car je ne peux pas écrire des fichiers dans GAE et enviroment Je ne peux pas créer une chaîne CSV à partir tuple comme here, en raison de la taille o mon jeu de résultats (En fait, Je l'ai essayé et ça prend trop de temps et ça a expiré avant la fin). Donc, ma question est la suivante: quelle est la meilleure façon d'obtenir un ensemble de résultats à partir de MySQL et de l'enregistrer au format CSV dans un seau de stockage Google Cloud?

+0

Pouvez-vous écrire dans des fichiers de mémoire? –

+0

Désolé @JohannesReichard, mais je n'ai pas compris votre question. Je suis un peu nouveau dans GAE. Est-ce que les fichiers de mémoire sont quelque chose que je peux écrire? – James

+1

Je n'ai jamais utilisé GAE mais python supporte non seulement l'écriture dans un fichier sur un disque dur mais aussi dans un fichier comme objet qui vit en mémoire: docs.python.org/3/library/io.html#in-memory –

Répondre

1

Je viens de passer par le même problème avec PHP. Je fini par utiliser le sql nuage api (https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/) avec le flux de travail suivant:

  1. Créer un seau d'exportation (c.-à-test-exportations)
  2. Donnez l'instance SQL de lecture/écriture des autorisations au seau créé à l'étape 1
  3. Dans l'application, appelez l'exportation d'instance (https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/instances/export). Ce point de terminaison accepte le SQL à exécuter, ainsi qu'un chemin vers un compartiment de sortie. (créé à l'étape (1))
  4. L'étape (3) retournera une opération avec une propriété 'name'. Vous pouvez utiliser ce « nom » et poll les opérations/get point final (https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/operations/get) jusqu'à ce que le statut est retourné comme FAIT

Nous avons un travail qui effectue ces étapes chaque soir (ainsi qu'une importation en utilisant la commande/import) sur 6 tables et n'ont encore vu aucun problème. La seule chose à garder à l'esprit est qu'une seule opération peut s'exécuter sur une seule instance de base de données à la fois. Pour lutter contre cela, vous devez le premier élément du point de terminaison de la liste des opérations (https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/operations/list) pour confirmer que la base de données est prête avant d'émettre des commandes.