0
votes

Comment faire référence à plusieurs variables dans A pour la boucle?

J'écris un script qui soumet plusieurs (30) requêtes SQL à Google BigQuery. Quelle est la meilleure façon de faire boucle dans les requêtes? Mon code fonctionne mais cela ne se sent pas très pythonique.

J'ai besoin de passer par le nom de la requête dans la tâche_id et de soumettre la requête. P>

def run_query(query,job_id):
    try:
        query_job = client.query(query,job_id=job_id)
        polling = 1
        while query_job.done() is False:
            if "q1_" in job_id:
                time.sleep(20)
                print("Job State : {} - Polling : {}".format(query_job.state,polling))
                polling +=1 
                query_job.reload()
            else:
                time.sleep(1)
                print("Job State : {} - Polling : {}".format(query_job.state,polling))
                polling +=1 
                query_job.reload()                     
    except Conflict as err:
        print("Could not run Query.  System Message: \n{}".format(err))
        sys.exit()


q1 = """SELECT * FROM XYZ"""
q2 = """SELECT TOP 10 * FROM YZF"""
q3 = """select id from fjfj"""
q4 = """SELECT * FROM XYZ"""
q5 = """SELECT TOP 10 * FROM YZF"""
q6 = """select id from fjfj"""

query_jobs = [q1,q2,q3,q4,q5,q6]

q = 0

for query in query_jobs:
    randid = str(uuid.uuid4())
    q+=1
    queries = "q"+str(q)
    job_id = queries+"_"+randid
    run_query(query,job_id)
    print job_id


2 commentaires

Si les requêtes ne sont pas gonig varient, ce que vous faites est le seul moyen de le faire. Si vous souhaitez accéder simultanément à plusieurs variables, vous ne devriez pas penser à utiliser une boucle. Faites-le juste un par un manuellement.


Il n'y a pas de réponse définitive, mais une multitude de préférences - vote à proximité comme principalement d'opinion.


3 Réponses :


1
votes

a l'air bien pour moi, vous pouvez améliorer légèrement cela en utilisant énumérer code> dans votre boucle au lieu d'un compteur:

for i, query in enumerate(query_jobs):
    randid = str(uuid.uuid4())
    queries = "q"+str(i)
    job_id = queries+"_"+randid
    run_query(query,job_id)
    print job_id


0 commentaires

0
votes

Tout d'abord, vous pouvez simplement simplifier votre méthode run_query avec quelque chose comme: xxx

Cela fonctionnerait à Python 3+, je ne suis pas sûr que ce sera wieht 2.7, mais vous avez eu l'idée.

Ensuite, vous devriez jeter un coup d'œil à Formatage de la chaîne Python , ce qui pourrait vraiment vous aider là-bas.

À la fin, vous pourriez avoir quelque chose comme ça: xxx


0 commentaires

0
votes

Je suggérerais d'inclure les requêtes dans un dictionnaire décrivant ce que chacun est pour. XXX PRE>

Selon la manière dont cela va devenir complexe, je suggérerais d'ajouter plus d'attributs. L'avantage comme celui-ci est si vous avez besoin de logique plus complexe dans Run_Query, vous pouvez contrôler cela via des attributs plutôt que le travail_id de la requête. P>

QUERIES = {
   "q1_XYZ": { 'query': """SELECT * FROM XYZ""", 'is_A': True, 'cost': 100 },
   << more samples >>
}

for job_id, details in query_jobs.items():
    run_query(details['query'],job_id)


0 commentaires