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

从Google Cloud Function连接Cloud SQL的MSSQL实例失败求助

解决方案

1. 修复代码中的两处错误

你的代码存在两个会导致连接失败的问题:

  • connect_tcp_socket函数未返回创建的engine,导致后续db.connect()调用报错
  • 连接字符串中PORT与DATABASE之间缺少分号,格式无效

修改后的代码:

import sqlalchemy
import pyodbc

def hello_world(request):
        db = connect_tcp_socket()
        a = execute_request(db)
        return str(a)
    
def connect_tcp_socket() -> sqlalchemy.engine.base.Engine:
    db_host = 'my_private_ip'  
    db_user = 'my_db_user'
    db_pass = 'my_db_pass'
    db_name = 'my_db_name'
    db_port = 'my_db_port' 

    # 补上PORT与DATABASE之间的分号
    connection_string = 'DRIVER={ODBC Driver 17 for SQL Server};SERVER='+db_host+';PORT='+db_port+';DATABASE='+db_name+';UID='+db_user+';PWD='+ db_pass+';Encrypt=no'
    connection_url = sqlalchemy.engine.url.URL.create("mssql+pyodbc", query={"odbc_connect": connection_string})
    engine = sqlalchemy.create_engine(connection_url)
    return engine  # 新增返回engine的语句

def execute_request(db: sqlalchemy.engine.base.Engine):
        print('ok')
        with db.connect() as conn:
            result = conn.execute(sqlalchemy.text('SELECT @@VERSION'))
            barray= []
            for row in result:
                barray.append(row)
        return barray

2. 解决ODBC驱动缺失问题

Google Cloud Function的Python运行环境默认未预装ODBC Driver 17 for SQL Server,需要通过构建步骤手动安装系统依赖和驱动:

步骤1:创建requirements.txt

sqlalchemy>=2.0.0
pyodbc>=4.0.39

步骤2:创建cloudbuild.yaml构建配置

steps:
# 安装系统依赖和ODBC驱动
- name: 'debian:bullseye'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    apt-get update && apt-get install -y unixodbc unixodbc-dev curl gnupg2
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
    curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list
    apt-get update
    ACCEPT_EULA=Y apt-get install -y msodbcsql17
# 部署Cloud Function
- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - 'functions'
  - 'deploy'
  - 'hello_world'
  - '--runtime'
  - 'python311'
  - '--trigger-http'
  - '--vpc-connector'
  - '你的VPC连接器名称'
  - '--region'
  - '你的部署区域'
  - '--source'
  - '.'

步骤3:执行部署

在本地终端运行:

gcloud builds submit --config cloudbuild.yaml .

3. 更简便的替代方案:使用Cloud SQL Python Connector

如果不想处理ODBC驱动的安装,可以使用Google官方的Cloud SQL Python Connector,它无需依赖ODBC,更适配Serverless环境:

替换后的代码

import sqlalchemy
from google.cloud.sql.connector import Connector, IPTypes

def hello_world(request):
    db = connect_with_connector()
    a = execute_request(db)
    return str(a)

def connect_with_connector() -> sqlalchemy.engine.base.Engine:
    # 替换为你的Cloud SQL实例连接名:项目ID:区域:实例名称
    instance_connection_name = "your-project-id:your-region:your-instance-name"
    db_user = "my_db_user"
    db_pass = "my_db_pass"
    db_name = "my_db_name"

    connector = Connector()

    def getconn():
        conn = connector.connect(
            instance_connection_name,
            "pytds",
            user=db_user,
            password=db_pass,
            db=db_name,
            ip_type=IPTypes.PRIVATE,  # 使用私有IP连接
        )
        return conn

    engine = sqlalchemy.create_engine(
        "mssql+pytds://",
        creator=getconn,
    )
    engine.dialect.description_encoding = None
    return engine

def execute_request(db: sqlalchemy.engine.base.Engine):
        print('ok')
        with db.connect() as conn:
            result = conn.execute(sqlalchemy.text('SELECT @@VERSION'))
            barray = []
            for row in result:
                barray.append(row)
        return barray

对应的requirements.txt

sqlalchemy>=2.0.0
cloud-sql-python-connector>=1.1.0
pytds>=1.10.0

直接使用常规的Cloud Function部署命令即可,无需额外安装系统驱动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:45:30