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
3 Réponses :
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
Tout d'abord, vous pouvez simplement simplifier votre méthode Cela fonctionnerait à Python 3+, je ne suis pas sûr que ce sera wieht 2.7, mais vous avez eu l'idée. P>
BlockQuote> Ensuite, vous devriez jeter un coup d'œil à Formatage de la chaîne Python , ce qui pourrait vraiment vous aider là-bas. P> À la fin, vous pourriez avoir quelque chose comme ça: p> run_query code> avec quelque chose comme:
Je suggérerais d'inclure les requêtes dans un dictionnaire décrivant ce que chacun est pour. 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)
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.