Meg*_*Ray 1 python sql google-bigquery
我使用以下Python代码删除BigQuery中一个表中的所有数据,当我在运行代码几秒钟后检查该表时,我发现该表现在是空的,因此删除肯定成功了。但是,作业状态仍然显示它处于 RUNNING 状态。
from google.cloud import bigquery
import time
client = bigquery.Client()
job_config = bigquery.QueryJobConfig()
job_config.priority = bigquery.QueryPriority.INTERACTIVE
sql = """DELETE FROM <table_name> WHERE TRUE"""
query_job = client.query( sql, job_config= job_config )
query_job = client.get_job( query_job.job_id ) # API request - fetches job
while query_job.state == "RUNNING":
print( "Job {} is currently in state {}".format( query_job.job_id, query_job.state ) )
time.sleep( 5 )
if query_job.errors != None:
print( "Query Failed." )
raise Exception( "Query Failed. Error: [ %s ]." % query_job.error_result )
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?为什么作业没有进入 DONE 状态?如何通过代码检查是否成功执行?
诀窍在这里:
query_job = client.get_job( query_job.job_id ) # API request - fetches job
while query_job.state == "RUNNING":
print( "Job {} is currently in state {}".format( query_job.job_id, query_job.state ) )
time.sleep( 5 )
Run Code Online (Sandbox Code Playgroud)
get_job返回某个时间点的作业状态,但不会在作业状态更改时自动更新。相反,您需要get_job作为循环的一部分调用:
while True:
query_job = client.get_job( query_job.job_id ) # API request - fetches job
if query_job.state != "RUNNING":
break
print( "Job {} is currently in state {}".format( query_job.job_id, query_job.state ) )
time.sleep( 5 )
Run Code Online (Sandbox Code Playgroud)