1

我正在使用适用于 Python 的 BigQuery API将数据插入到带有table.insert_data().

有时,一行将包含 在表模式中设置为模式的字段的None 值。REPEATED发生这种情况时,API会返回以下错误:

[{'index': 48, 
'errors': [
    {u'debugInfo': u'generic::invalid_argument: Field value cannot be empty.', 
     u'reason': u'invalid', 
     u'message': u'Field value cannot be empty.', 
     u'location': u'name_of_my_field'}]}]

我希望这些行被忽略。这是我正在使用的函数的原型,也可以在这里找到:

insert_data(rows, row_ids=None, skip_invalid_rows=None, ignore_unknown_values=None, template_suffix=None, client=None)

是我感兴趣的参数,因为它似乎完全符合我的需求:

skip_invalid_rows (bool) – (Optional) skip rows w/ invalid data?

它在主 API中反映了这个参数:

skipInvalidRows boolean [Optional] Insert all valid rows of a request, even if invalid rows exist. The default value is false, which causes the entire request to fail if any invalid rows exist.

但是,通过使用 with 函数skip_invalid_rows=True会引发相同的错误

这个参数是否意味着我认为的意思?

值得指出:

  • 为什么文档中描述的末尾有一个问号skip_invalid_rows
  • ignore_unknown_values=True为自己的目的工作正常。

非常感谢任何帮助。:)

4

1 回答 1

3

也许这令人困惑,但仍应抛出错误,以告知最终用户某些事情未按预期处理。

这并不意味着虽然没有保存正确的行,但它们应该保存!如果您检查您的表格,您应该会看到这些行在那里正常写入。

您可以运行一个简单的测试,例如:

table.insert_data([('1', ['1', None, '2']), ('2', ['1', '2'])])

在这种情况下,('2', ['1', '2'])应该正常保存该值。

我同意docstrings这种方法的评论没有那么有用。我本人正要提出一个拉取请求,为Table资源添加一些新功能,但预计在不久的将来会对该模块进行一些重大重构,所以现在你可能会在那里找到这些类型的东西(以及其他一些也可能令人困惑的东西例如其中job定义的资源table)。

于 2017-09-14T15:23:34.337 回答