繁体   English   中英

从 Google Cloud Function 连接到 Mssql 实例的问题

[英]Issue Connecting to Mssql Instance From Google Cloud Function

我正在尝试连接到云 function 中的云 sql 中的 mssql 实例。 我已经完成了设置私有 IP、无服务器 VPC 连接器并将我的 function 连接到 VPC 的必要步骤。 我已经能够连接到 nodejs 中的实例,但 python 更适合我当前的需求。 我在日志中得到的错误是:

pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server'

从我读过的所有示例中,您似乎不需要导入它们或任何东西。 这是我连接和执行一个简单请求的过程。

import sqlalchemy
import pyodbc

def hello_world(request):
        # connect_simple()
        db = connect_tcp_socket()
        a = execute_request(db)
        return 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' 

    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
    )

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

I'd recommend using the Cloud SQL Python Connector to connect to Cloud SQL from Python as it will not require the ODBC driver and is much easier to use within Cloud Functions/Cloud Run.

只需将您的connect_tcp_socket替换为以下connect_with_connector function。

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

import sqlalchemy

def connect_with_connector() -> sqlalchemy.engine.base.Engine:
    def getconn() -> pytds.Connection:
        with Connector() as connector:
            conn = connector.connect(
                "project-id:region:instance-name",  # Cloud SQL connection name
                "pytds",
                user="my-user",
                password="my-password",
                db="my-database",
                ip_type=IPTypes.PRIVATE
            )
            return conn

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

您可以找到 Python 连接器的代码示例,类似于您用于建立 TCP 连接的代码示例。

注意: Pytds 驱动程序在错误处理方面并不是超级棒。 如果您看到OSError: [Errno 9] Bad file descriptor错误,这通常意味着您的数据库用户缺少适当的权限,应该从 root 用户那里授予他们必要的权限。

您的requirements.txt应包括以下内容:

cloud-sql-python-connector
SQLAlchemy
python-tds
sqlalchemy-pytds

还有一个交互式入门Colab 笔记本,它将引导您使用 Python 连接器,而无需更改一行代码!

它使从 Cloud Functions 连接到 Cloud SQL 既简单又安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM