错误“无法在具有DML语句的作业中设置目标表”,即使我没有设置目标表

时间:2019-10-24 21:42:40

标签: python google-bigquery

在首先删除目标中的数据后,我使用以下代码从一个bigquery表中选择数据并将其插入到另一个表中:

#delete
sql = """
delete from `b` 
where _date_ = '2019-10-24'
"""
query_job = client.query(sql)
results = query_job.result()

#insert
sql = """
insert into `b` (col1,col2) 
select col1, col2 from a
where a._date_ = '2019-10-24'
"""
query_job = client.query(sql)
results = query_job.result()

它成功运行。但是,我想对运行日期进行参数化,因此我遵循了https://cloud.google.com/bigquery/docs/parameterized-queries上的示例并将其更改为:

query_params = [
        bigquery.ScalarQueryParameter("_date_", "STRING", "2019-10-24")
]
job_config = bigquery.QueryJobConfig()
job_config.query_parameters = query_params

#delete
sql = """
delete from `b` 
where _date_ = @_date_
"""
query_job = client.query(sql, job_config=job_config)
results = query_job.result()

#insert
sql = """
insert into `b` (col1,col2)
select col1, col2 from a
where a._date_ = @_date_
"""
query_job = client.query(sql, job_config=job_config)
results = query_job.result()

此操作现在失败,并出现插入错误:

  

无法在具有DML语句的作业中设置目标表

删除工作正常!

我已经四处搜寻,并发现了在job_config中指定目标表时发生此错误的示例(例如Cannot set destination table in jobs with DML statements in BigQuery),但是我没有这样做,所以我有点困惑。

为什么我提供查询参数会导致代码因该错误而失败?

1 个答案:

答案 0 :(得分:1)

问题在于,运行DML语句会更新传递给job_config的{​​{1}}中的目标表。您需要像这样重置它们:

client.query