Google bigquery BigQuery API是否可以使用create_table()(表插入)覆盖现有表/视图?

Google bigquery BigQuery API是否可以使用create_table()(表插入)覆盖现有表/视图?,google-bigquery,Google Bigquery,我使用的是调用底层的。有一个exists\u ok参数,但如果表已经存在,则这会导致函数忽略create。问题是,在创建视图时,我希望覆盖现有的视图SQL(如果它已经存在)。我目前正在做的是: if overwrite: bq_client.delete_table(view, not_found_ok=True) view = bq_client.create_table(view) 我不喜欢的是,在这几秒钟内,视图可能不再存在。如果代码在删除之后但在创建之前由于任何原因死亡,那么

我使用的是调用底层的。有一个
exists\u ok
参数,但如果表已经存在,则这会导致函数忽略create。问题是,在创建视图时,我希望覆盖现有的视图SQL(如果它已经存在)。我目前正在做的是:

if overwrite:
    bq_client.delete_table(view, not_found_ok=True)

view = bq_client.create_table(view)
我不喜欢的是,在这几秒钟内,视图可能不再存在。如果代码在删除之后但在创建之前由于任何原因死亡,那么视图实际上就消失了


我的问题:是否有办法创建一个表(视图),以便覆盖任何现有对象?或者我必须检测到这种情况并运行某种
update_table()
()?

如果您想覆盖现有表,可以使用
google.cloud.bigquery.job.WriteDisposition
类,请参阅

这里有三种可能性:
WRITE\u APPEND
WRITE\u EMPTY
WRITE\u TRUNCATE
。您应该使用的是
WRITE\u TRUNCATE
,它会覆盖表数据

您可以在此处看到以下示例:

from google.cloud import bigquery
import pandas

client = bigquery.Client()

table_id = "<YOUR_PROJECT>.<YOUR_DATASET>.<YOUR_TABLE_NAME>"

records = [
    {"artist": u"Michael Jackson", "birth_year": 1958},
    {"artist": u"Madonna", "birth_year": 1958},
    {"artist": u"Shakira", "birth_year": 1977},
    {"artist": u"Taylor Swift", "birth_year": 1989},
]
dataframe = pandas.DataFrame(
    records,
    columns=["artist", "birth_year"],
    index=pandas.Index(
        [u"Q2831", u"Q1744", u"Q34424", u"Q26876"], name="wikidata_id"
    ),
)
job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("artist", bigquery.enums.SqlTypeNames.STRING),
        bigquery.SchemaField("wikidata_id", bigquery.enums.SqlTypeNames.STRING),
    ],
    write_disposition="WRITE_TRUNCATE",
)

job = client.load_table_from_dataframe(
    dataframe, table_id, job_config=job_config
)
job.result()

table = client.get_table(table_id)

“写处理”是创建加载作业以生成表的一部分。我特别询问了创建表的API命令(因为我使用它来创建视图)。我用更新视图代码更新了我的问题。你也可以看看
client = bigquery.Client(project="projectName")
table_ref = client.dataset('datasetName').table('tableViewName')
table = client.get_table(table_ref)
table.view_query = "SELECT * FROM `projectName.dataset.sourceTableName`"
table = client.update_table(table, ['view_query'])