DELETE 成功后,BigQuery 作业仍处于 RUNNING 状态

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 状态?如何通过代码检查是否成功执行?

Ell*_*ard 5

诀窍在这里:

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)