英文:
How can I create a table in BigQuery with non-required fields?
问题
我正在使用Go语言编写一个RESTful API,用于在BigQuery中写入行。我正在使用Google BigQuery Go包。
为了创建BigQuery模式,我正在根据一个结构体推断模式,就像示例中描述的那样。
问题是,生成的模式将所有非重复字段都标记为“必需”,因此,当我想上传包含空值的结构体时,空值会被上传为空字段...
这是我的结构体示例:
type Stats struct {
Name string `bigquery:"name"`
LastName int `bigquery:"last_name"`
PhoneNumber string `bigquery:"phone_number"`
}
这是创建模式的示例:
testSchema, err := bigquery.InferSchema(Stats{})
if err != nil {
// TODO: 处理错误。
}
如果我上传一个只设置了一个字段的结构体:
rows := []*Stats{
{Name: "testA"},
}
u := table.Uploader()
err2 := u.Put(ctx, rows)
结果是,在BigQuery中,“last_name”和“phone_number”字段是空字符串"",而不是NULL。
英文:
I'm making a RESTful API in Go that writes rows in BigQuery. I'm using Google BigQuery package for Go.
In order to create the BigQuery scheme, I'm infering the schema from a struct as described in the example.
The problem is that, the resulting schema has all the non-repeated fields as "Required", so that, when I want to upload a struct with null values, the null values are uploaded as empy fields...
This is an example of my struct:
type Stats struct {
Name string `bigquery:"name"`
LastName int `bigquery:"last_name"`
PhoneNumber string `bigquery:"phone_number"`
}
This is an example of how the schema is created:
testSchema, err := bigquery.InferSchema(Stats{})
if err != nil {
// TODO: Handle error.
}
And, if I upload a struct with only one field set:
rows := []*Stats{
{Name: "testA"},
}
u := table.Uploader()
err2 := u.Put(ctx, rows)
The result is that, in BigQuery, the fields "last_name" and "phone_number" is an empty string "" instead of NULL
答案1
得分: 2
为了实现这一点,显然你需要使用特定的BigQuery可空类型(NullInt64、NullFloat64、NullString、NullBool、NullTimestamp、NullDate、NullTime和NullDateTime)。
使用bigquery.NullBool的示例:https://godoc.org/cloud.google.com/go/bigquery#ex-InferSchema--Tags
英文:
For that, apparently you would have to use the specific BigQuery nullable types (NullInt64, NullFloat64, NullString, NullBool, NullTimestamp, NullDate, NullTime and NullDateTime).
Example using bigquery.NullBool: https://godoc.org/cloud.google.com/go/bigquery#ex-InferSchema--Tags
答案2
得分: 0
我不是Go专家,但是看了一下这段代码(https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/bigquery/schema.go#L182),似乎inferFieldSchema
方法总是将Required
设置为true
。我建议你提交一个bug报告来允许控制这个属性(虽然不清楚如何控制),或者在创建模式后对模式进行修补 - BigQuery支持将模式从REQUIRED修改为NULLABLE。
英文:
I am no Go expert, but looking at code at https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/bigquery/schema.go#L182 it looks like the inferFieldSchema
method always sets Required: true
. I would file a bug to allow to control it (although not clear how), or you can patch your schema after it was created - schema modification from REQUIRED to NULLABLE is supported by BigQuery.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论