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

在GCP中创建读取BigQuery数据的REST API(Python端到端方案咨询)

基于Python的GCP云原生REST API读取BigQuery数据方案

整体架构思路

推荐两种云原生实现路径:

  • Cloud Functions:轻量无服务器,适合快速搭建简单API,无需管理服务器
  • Cloud Run:容器化无服务器,适合需要自定义环境、扩缩容更灵活的场景

两者都能直接和BigQuery集成,通过服务账号权限控制数据访问,对外提供HTTP接口供外部应用调用。

步骤分解与示例代码

一、前置准备

  • 安装并初始化gcloud SDK,完成本地认证
  • 启用GCP服务:BigQuery API、Cloud Functions API(选前者)或Cloud Run API(选后者)
  • 确保你的GCP账号拥有BigQuery数据读取权限,以及对应服务的部署权限

二、方案1:Cloud Functions(快速实现)

代码实现(main.py)

import functions_framework
from google.cloud import bigquery
import json

# 初始化BigQuery客户端
client = bigquery.Client()

@functions_framework.http
def bigquery_api(request):
    # 设置CORS,允许外部域名调用(可选,根据实际需求调整)
    headers = {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST'
    }

    # 处理OPTIONS请求(CORS预检)
    if request.method == 'OPTIONS':
        return ('', 204, headers)

    # 从请求参数获取查询条件(示例:获取指定用户的数据)
    request_args = request.args
    user_id = request_args.get('user_id', default=None, type=str)
    
    if not user_id:
        return (json.dumps({"error": "Missing user_id parameter"}), 400, headers)

    # BigQuery查询语句
    query = f"""
        SELECT user_name, email, created_at
        FROM `your-project-id.your-dataset.your-table`
        WHERE user_id = @user_id
    """

    # 使用参数化查询防止SQL注入
    job_config = bigquery.QueryJobConfig(
        query_parameters=[
            bigquery.ScalarQueryParameter("user_id", "STRING", user_id)
        ]
    )

    try:
        # 执行查询
        query_job = client.query(query, job_config=job_config)
        results = query_job.result()

        # 将查询结果转为JSON格式
        data = [dict(row) for row in results]
        return (json.dumps({"data": data}), 200, headers)
    except Exception as e:
        return (json.dumps({"error": str(e)}), 500, headers)

部署命令

gcloud functions deploy bigquery-api \
    --runtime python311 \
    --trigger-http \
    --allow-unauthenticated \
    --service-account your-service-account@your-project-id.iam.gserviceaccount.com

注意:--allow-unauthenticated会允许公开访问,生产环境建议改用IAM认证或API Key限制访问

权限配置

给部署时指定的服务账号添加BigQuery Data Viewer角色,确保它能读取目标BigQuery数据集/表。


三、方案2:Cloud Run(容器化灵活部署)

1. 代码实现(main.py,使用FastAPI)

from fastapi import FastAPI, HTTPException
from google.cloud import bigquery
from pydantic import BaseModel
import uvicorn

app = FastAPI()
client = bigquery.Client()

# 定义请求参数模型
class QueryRequest(BaseModel):
    user_id: str

@app.get("/api/get-user-data")
async def get_user_data(user_id: str):
    if not user_id:
        raise HTTPException(status_code=400, detail="Missing user_id parameter")
    
    query = f"""
        SELECT user_name, email, created_at
        FROM `your-project-id.your-dataset.your-table`
        WHERE user_id = @user_id
    """
    job_config = bigquery.QueryJobConfig(
        query_parameters=[
            bigquery.ScalarQueryParameter("user_id", "STRING", user_id)
        ]
    )
    
    try:
        query_job = client.query(query, job_config=job_config)
        results = query_job.result()
        data = [dict(row) for row in results]
        return {"data": data}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.post("/api/get-user-data")
async def post_user_data(request: QueryRequest):
    return await get_user_data(request.user_id)

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8080)

2. Dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY main.py .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]

3. requirements.txt

fastapi==0.104.1
uvicorn==0.24.0.post1
google-cloud-bigquery==3.12.0
pydantic==2.5.0

4. 部署命令

# 构建镜像
gcloud builds submit --tag gcr.io/your-project-id/bigquery-api-service

# 部署到Cloud Run
gcloud run deploy bigquery-api-service \
    --image gcr.io/your-project-id/bigquery-api-service \
    --platform managed \
    --allow-unauthenticated \
    --service-account your-service-account@your-project-id.iam.gserviceaccount.com

权限配置

同样给服务账号添加BigQuery Data Viewer角色,生产环境建议关闭--allow-unauthenticated,使用Cloud IAP或API网关控制访问。


四、测试API

部署完成后,你会得到一个API端点,比如:

  • Cloud Functions:https://REGION-PROJECT_ID.cloudfunctions.net/bigquery-api?user_id=123
  • Cloud Run:https://bigquery-api-service-xxxxxx-REGION.run.app/api/get-user-data?user_id=123

用curl或Postman发送请求,验证是否能正常返回BigQuery中的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:10:12