使用Python API使用记录字段更新BigQuery架构

使用Python API使用记录字段更新BigQuery架构,python,google-bigquery,Python,Google Bigquery,我们正在编写代码,通过使用pythonapi以自动化的方式使用额外的元数据“扩充”BigQuery表 我们通过使用键值标签系统(工作正常)来实现这一点,并通过以下方式更新列描述: 对于每个表,迭代模式列 对列元数据执行一些操作 将列添加到新架构 更新模式 但是,最后一步在处理具有记录类型字段的表时出错。尝试更新架构时,我在记录字段内的第一个嵌套字段上收到以下错误: SchemaField(u'nestedField',u'integer',u'NULLABLE',None,())不可用 JS

我们正在编写代码,通过使用pythonapi以自动化的方式使用额外的元数据“扩充”BigQuery表

我们通过使用键值标签系统(工作正常)来实现这一点,并通过以下方式更新列描述:

  • 对于每个表,迭代模式列
  • 对列元数据执行一些操作
  • 将列添加到新架构
  • 更新模式
但是,最后一步在处理具有记录类型字段的表时出错。尝试更新架构时,我在记录字段内的第一个嵌套字段上收到以下错误:

SchemaField(u'nestedField',u'integer',u'NULLABLE',None,())不可用 JSON可序列化

代码如下所示:

orig_table = bigquery_client.get_table(table)
schema = list(orig_table.schema)

new_schema = list()

for column in schema:
        columntxt = *do something to define the column metadata* 

        new_schema.append(bigquery.SchemaField(column.name, column.field_type, column.fields,  description=columntxt ))

orig_table.schema = new_schema
table = bigquery_client.update_table(orig_table, ['schema', 'labels'])

如何正确解决此问题/使代码与嵌套的架构表一起工作?

构建请求的方式是向
SchemaField
构造函数发送错误的参数(而构造函数又无法编码为JSON)

请尝试以下方法:

for column in schema:
    columntxt = *do something to define the column metadata* 
    new_schema.append(bigquery.SchemaField(
        column.name,
        column.field_type,
        fields=column.fields,
        description=columntxt,
        mode=column.mode))

orig_table.schema = new_schema
table = bigquery_client.update_table(orig_table, ['schema'])

谢谢,成功了!甚至通过编码使其更加明确:new_schema.append(bigquery.SchemaField(name=column.name,field_type=column.field_type,fields=column.fields,description=columntxt,mode=column.mode))有趣的事情,如果您喜欢这样做,您可能会向那些阅读您的代码的人指出,方法签名是由关键字参数组成的,这可能会导致一些混淆。虽然这是可行的,但我怀疑(仍然需要确认)最好像这样表达位置参数,并且只使用关键字,这样就不会对代码进行含糊不清的解释。不过,您可以选择最适合您的编码风格的东西。很高兴知道答案有效:)Willian,说到Python编码,我还是个初学者。因此,我不完全理解你的最后一句话。但正如我想了解的:你有任何外部参照来解释你的意思吗?这似乎足够好了。虽然阅读几分钟,但对于学习这些东西来说,这似乎是一个很好的开始。