动态访问BigQuery数据集上的设置

时间:2018-05-07 06:31:11

标签: python-3.x google-cloud-platform

我需要在运行时创建BigQuery Dataset并在运行时分配所需的角色。为此使用Python脚本。我在Google上搜索了有关如何在创建数据集后更新访问设置的帮助,并遇到solution以下内容:

entry = bigquery.AccessEntry(
    role='READER',
    entity_type='userByEmail',
    entity_id='sample.bigquery.dev@gmail.com')
assert entry not in dataset.access_entries
entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ['access_entries'])  # API request

assert entry in dataset.access_entries

我的要求是根据创建数据集的区域为数据集分配多个角色,如下所示:

"access": [
 {"role": "OWNER","groupByEmail": "gcp.abc.bigquery-admin@xyz.com"},
 {"role": "READER","groupByEmail": "gcp.def.bigdata@xyz.com"},
 {"role": "READER","groupByEmail": "gcp.ghi.bigquery@xyz.com"}]

有人能建议最好的方法吗?我想将GroupByMail和Role作为键,值对存储为配置文件中的字典,并逐个读取和分配每个值。有没有其他最好的方法来完成它? 任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

上述代码适用于在BQ数据集创建时为数据集分配访问控制,但更新访问权限并不理想:

如果' sample.bigquery.dev@gmail.com' 已经有 role =' OWNER ,请说并且运行上面的代码,您将拥有两个访问条目,一个具有OWNER角色,另一个具有READER角色。

要进行更新,您可能需要检查 entity_id 是否已存在。如果没有附加条目,否则覆盖条目。 (通过BQ UI可能更容易实现)

现在说,如果你必须分配多个角色,你可以有一个条目列表。

from google.cloud import bigquery
client = bigquery.Client()
dataset_id = 'test_dataset'

dataset_ref = client.dataset(dataset_id)
dataset = bigquery.Dataset(dataset_ref)
dataset.location = 'EU'
dataset = client.create_dataset(dataset)  

entries_list = [bigquery.AccessEntry('OWNER','groupByEmail','gcp.abc.bigquery-admin@xyz.com'),
                bigquery.AccessEntry('READER','groupByEmail', 'gcp.def.bigdata@xyz.com'),
                bigquery.AccessEntry('READER','groupByEmail', 'gcp.ghi.bigquery@xyz.com')]

entries = list(dataset.access_entries)
entries.extend(entries_list)
dataset.access_entries = entries
dataset = client.update_dataset(dataset, ['access_entries'])  # API request