You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用google-cloud-bigquery crate创建ARRAY<STRUCT<..>>参数?

解决BigQuery ARRAY类型参数的创建问题

使用google-cloud-bigquery crate访问BigQuery时,要构造ARRAY<STRUCT<..>>类型的参数,关键是正确填充QueryParameterValue的struct_values字段——它需要接收一个Box包裹的结构体字段值数组。以下是修复后的完整代码:

#[derive(Debug, Clone)]
pub struct Hello {
    pub bar: String,
    pub foo: String,
}

fn main() {
    let hello_array = vec![
        Hello {
            bar: "Bar1".to_string(),
            foo: "Foo1".to_string(),
        },
        Hello {
            bar: "Bar2".to_string(),
            foo: "Foo2".to_string(),
        },
    ];

    let query_parameter = QueryParameter {
        name: Some("hello_array_param".to_string()),
        parameter_type: QueryParameterType {
            parameter_type: "ARRAY".to_string(),
            array_type: Some(Box::new(QueryParameterType {
                parameter_type: "STRUCT".to_string(),
                struct_types: Some(vec![
                    QueryParameterStructType {
                        name: Some("bar".to_string()),
                        field_type: QueryParameterType {
                            parameter_type: "STRING".to_string(),
                            array_type: None,
                            struct_types: None,
                        },
                        description: None,
                    },
                    QueryParameterStructType {
                        name: Some("foo".to_string()),
                        field_type: QueryParameterType {
                            parameter_type: "STRING".to_string(),
                            array_type: None,
                            struct_types: None,
                        },
                        description: None,
                    },
                ]),
                array_type: None,
            })),
            struct_types: None,
        },
        parameter_value: QueryParameterValue {
            value: None,
            array_values: Some(hello_array.iter().map(|hello| QueryParameterValue {
                struct_values: Some(Box::new(vec![
                    // 对应struct_types里的第一个字段bar
                    QueryParameterValue {
                        value: Some(hello.bar.clone()),
                        array_values: None,
                        struct_values: None,
                    },
                    // 对应struct_types里的第二个字段foo
                    QueryParameterValue {
                        value: Some(hello.foo.clone()),
                        array_values: None,
                        struct_values: None,
                    },
                ])),
                value: None,
                array_values: None,
            }).collect()),
            struct_values: None,
        },
    };

    println!("QueryParameter: {:#?}", query_parameter);
}

关键说明:

  • struct_values字段的类型是Option<Box<Vec<QueryParameterValue>>>,需要将结构体的每个字段转换为单独的QueryParameterValue,放入Vec后用Box::new包裹
  • 结构体字段对应的QueryParameterValue顺序必须和parameter_type中struct_types定义的字段顺序完全一致,BigQuery会按顺序匹配结构体字段
  • 每个字段值通过QueryParameterValue的value字段传入,这里因为是字符串类型,直接赋值Some(字段值.clone())即可

内容的提问来源于stack exchange,提问作者Niels Bosma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:41:12