在首先删除目标中的数据后,我使用以下代码从一个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),但是我没有这样做,所以我有点困惑。
为什么我提供查询参数会导致代码因该错误而失败?
答案 0 :(得分:1)
问题在于,运行DML语句会更新传递给job_config
的{{1}}中的目标表。您需要像这样重置它们:
client.query