Я использовал следующий код Python для удаления всех данных из таблицы в BigQuery. Когда я проверил таблицу через несколько секунд после запуска кода, я обнаружил, что таблица теперь пуста, следовательно, удаление должно быть выполнено успешно. Однако состояние задания по-прежнему показывает, что оно находится в состоянии РАБОТА.
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 )
Что здесь не так? Почему задание не переходит в состояние ГОТОВО? Как я могу проверить успешное выполнение с помощью кода?
Большое спасибо ! Это помогло. Почему бы тебе не записать это как полный ответ, чтобы я мог его принять.
Конечно, добавил ответ (надеюсь, синтаксис правильный). Спасибо!
Уловка здесь:
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 )
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 )
Я почти уверен, что вам нужно вызвать
get_job
как часть цикла.