如何通过Python客户端库为Google BigQuery设置现有表过期?

如何通过Python客户端库为Google BigQuery设置现有表过期?,python,google-bigquery,Python,Google Bigquery,使用官方软件,似乎无法在现有表上设置表过期时间(或其他属性);你只能“在上面” API本身有一个命令,允许设置expirationTime属性。但是,我在客户机库代码中看不到这种用法 client.py中的以下代码用于create\u table,我认为只需将“POST”更改为“PATCH”并将table\u id添加到路径中即可 客户端库中不支持表修补是有原因的还是我遗漏了什么 table = _table_arg_to_table(table, default_project=sel

使用官方软件,似乎无法在现有表上设置表
过期时间
(或其他属性);你只能“在上面”

API本身有一个命令,允许设置
expirationTime
属性。但是,我在客户机库代码中看不到这种用法

client.py
中的以下代码用于
create\u table
,我认为只需将
“POST”
更改为
“PATCH”
并将
table\u id
添加到路径中即可

客户端库中不支持表修补是有原因的还是我遗漏了什么

    table = _table_arg_to_table(table, default_project=self.project)

    path = "/projects/%s/datasets/%s/tables" % (table.project, table.dataset_id)
    data = table.to_api_repr()
    try:
        api_response = self._call_api(retry, method="POST", path=path, data=data)
        return Table.from_api_repr(api_response)
    except google.api_core.exceptions.Conflict:
        if not exists_ok:
            raise
        return self.get_table(table.reference, retry=retry)

我能够编写一个
patch\u table()
函数,该函数利用当前的
客户机
对象。这里的潜在问题是,如果
\u call\u api
函数名发生任何更改,它将中断:

def patch_table(client, table, expires):
    """ Support table patching similar to `create_table`

    RE: https://stackoverflow.com/questions/59431486/
    RE: https://cloud.google.com/bigquery/docs/reference/rest/v2/tables/patch

    :param client: `google.cloud.bigquery.client.Client` object.
    :param table: `google.cloud.bigquery.Table` object.
    :param expires: New expiration to apply to table.
    """
    from google.cloud.bigquery import Table
    from google.cloud.bigquery.retry import DEFAULT_RETRY

    assert isinstance(table, Table)
    table.expires = expires

    # table.description and table.labels can also be set here

    path = f"/projects/{bq.project}/datasets/{dataset}/tables/{table}"
    data = table.to_api_repr()
    api_response = client._call_api(
        DEFAULT_RETRY, method="PATCH", path=path, data=data)
    return Table.from_api_repr(api_response)

希望这能帮助其他人。也许可以将其添加到客户机。客户机有一个更新表的方法:和

您可以使用检索表格设置以获取
表格。表格
。然后,使用新的所需日期修改
expires
属性,并使用
update\u table
对其进行更新(注意,我们指定了要更新的字段列表):

table\u info=client.get\u table(table\u name)
表_info.expires=datetime.now()+timedelta(天=1)
新建\u表\u信息=client.update\u表(
表_信息,['expires'])
例如,我创建了一个没有过期的空表:

$bq mk-t test.expiration
已成功创建表“PROJECT\u ID:test.expiration”。
然后运行脚本(库版本为
googlecloudbigquery==1.23.1
):

初始到期:无
最终到期时间:2019-12-22 08:47:52.507000+00:00
完整代码:

从日期时间导入日期时间
从日期时间导入时间增量
从google.cloud导入bigquery
project\u id=“project\u id”
表\u name=“测试到期”
client=bigquery.client(project=project\u id)
#获取初始到期日期
table\u info=client.get\u table(table\u name)
打印(“初始到期:{}”。格式(表_info.expires))
#使用新的所需字段进行更新
表_info.expires=datetime.now()+timedelta(天=1)
新建\u表\u信息=client.update\u表(
表_信息,['expires'])
#检查结果
打印(“最终到期:{}”。格式(新的表格信息到期))

谢谢,我知道一定有办法在当前客户机中实现这一点。这种方法似乎不必要地复杂。当我尝试这种方法时,更新的效果只是使表消失。知道为什么吗?也张贴为。