如何通过服务账号JSON密钥在C++中连接GCP BigQuery并执行SQL查询
C++连接GCP BigQuery并执行SQL查询示例(VS + VCPKG环境)
前置操作
- 用vcpkg安装BigQuery C++ SDK:
vcpkg install google-cloud-cpp-bigquery:x64-windows(根据你的开发平台调整架构参数) - 确保VS项目已完成vcpkg集成(执行
vcpkg integrate install后新建的项目会自动生效) - 将你的服务账号.json密钥文件放在项目输出目录,或记下文件的完整路径
完整示例代码
#include <google/cloud/bigquery/client.h> #include <google/cloud/bigquery/query_results.h> #include <iostream> #include <string> #include <fstream> #include <iterator> int main() { // 方式1:通过环境变量指定密钥文件路径 setenv("GOOGLE_APPLICATION_CREDENTIALS", "path/to/your/service-account-key.json", 1); // 初始化BigQuery客户端 auto client = google::cloud::bigquery::MakeBigQueryClient(); if (!client) { std::cerr << "创建BigQuery客户端失败: " << client.status() << "\n"; return 1; } // 替换为你要执行的SQL语句 std::string sql = R"( SELECT name, age FROM `your-project-id.your-dataset-id.your-table-id` LIMIT 10 )"; // 提交查询请求 auto query_result = client->Query(sql); if (!query_result) { std::cerr << "查询执行失败: " << query_result.status() << "\n"; return 1; } // 遍历并打印查询结果 std::cout << "查询结果:\n"; for (auto const& row : *query_result) { if (!row) { std::cerr << "行数据读取错误: " << row.status() << "\n"; continue; } // 根据表结构调整字段名和类型 std::string name = row->get<std::string>("name").value_or(""); std::int64_t age = row->get<std::int64_t>("age").value_or(0); std::cout << "姓名: " << name << ", 年龄: " << age << "\n"; } return 0; }
补充说明
- 直接加载密钥内容:如果不想用环境变量,可直接读取密钥文件初始化客户端,示例代码如下:
std::ifstream key_file("path/to/your/service-account-key.json"); std::string key_content((std::istreambuf_iterator<char>(key_file)), {}); auto credentials = google::cloud::MakeServiceAccountCredentials(key_content); auto client = google::cloud::bigquery::MakeBigQueryClient(credentials); - 字段类型匹配:
row->get<T>(field_name)中的模板参数T需与表字段类型对应,比如字符串用std::string,数值型用std::int64_t/double等 - 错误处理:SDK返回的
StatusOr类型必须先检查有效性,避免空指针或无效值访问
内容的提问来源于stack exchange,提问作者Chris S
相关产品推荐
相关产品推荐

