You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Python的pyodbc、mssql连接器或SQLAlchemy实现基于IAM认证和访问令牌的云SQL Server连接?

如何通过Python的pyodbc、mssql连接器或SQLAlchemy实现基于IAM认证和访问令牌的云SQL Server连接?

我来帮你解决线上环境无法依赖本地DSN的问题,下面分别说说pyodbc、mssql官方连接器和SQLAlchemy的实现方式:

一、用pyodbc直接配置(摆脱DSN依赖)

之前你用DSN本地能跑但线上不行,核心原因是线上环境没有本地Windows注册表的DSN配置。pyodbc支持直接在连接字符串里指定所有参数,包括ODBC驱动名、IAM访问令牌,完全不用依赖DSN:

  1. 首先要确认线上环境安装了对应的ODBC驱动,比如常用的ODBC Driver 17 for SQL Server(Windows、Linux、macOS都支持)。
  2. 通过云服务商的IAM SDK获取访问令牌(以Azure为例,其他云服务商逻辑类似,替换令牌获取部分即可)。
  3. 构造无DSN的连接字符串,直接传入AccessToken参数。

代码示例:

import pyodbc
from azure.identity import DefaultAzureCredential

# 从云IAM服务获取访问令牌
credential = DefaultAzureCredential()
# 这里的资源ID要对应你的云SQL Server的服务标识,Azure是https://database.windows.net/.default
token = credential.get_token("https://database.windows.net/.default")

# 构造完整连接字符串(无需DSN)
conn_str = (
    "DRIVER={ODBC Driver 17 for SQL Server};"
    "SERVER=你的云SQL服务器地址,1433;"  # 比如xxx.database.windows.net,1433
    "DATABASE=你的数据库名;"
    "AccessToken=" + token.token + ";"
)

# 建立连接并测试
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
cursor.execute("SELECT @@VERSION;")
print(cursor.fetchone()[0])
conn.close()

二、用mssql官方连接器(mssql-connector-python)

微软官方的mssql连接器同样支持直接传入访问令牌,语法更简洁,也不需要DSN:

from mssql_connector import connect
from azure.identity import DefaultAzureCredential

# 获取IAM访问令牌
credential = DefaultAzureCredential()
token = credential.get_token("https://database.windows.net/.default")

# 直接传入所有连接参数
conn = connect(
    server="你的云SQL服务器地址,1433",
    database="你的数据库名",
    access_token=token.token,
    driver="ODBC Driver 17 for SQL Server"
)

# 测试查询
cursor = conn.cursor()
cursor.execute("SELECT 1")
print(cursor.fetchone())
conn.close()

三、用SQLAlchemy封装(适合ORM场景)

如果你的项目用了SQLAlchemy做ORM,也可以构造包含所有参数的连接URL,完全脱离DSN:

import sqlalchemy as sa
from sqlalchemy.engine import URL
from azure.identity import DefaultAzureCredential

# 获取访问令牌
credential = DefaultAzureCredential()
token = credential.get_token("https://database.windows.net/.default")

# 构造SQLAlchemy连接URL
db_url = URL.create(
    "mssql+pyodbc",
    host="你的云SQL服务器地址",
    port=1433,
    database="你的数据库名",
    query={
        "driver": "ODBC Driver 17 for SQL Server",
        "AccessToken": token.token
    }
)

# 创建引擎并测试连接
engine = sa.create_engine(db_url)
with engine.connect() as conn:
    result = conn.execute(sa.text("SELECT @@VERSION;"))
    print(result.fetchone()[0])

关键注意事项

  • 线上环境必须安装对应版本的ODBC驱动:Linux可以通过包管理器安装msodbcsql17,macOS用Homebrew安装mssql-tools,Windows直接下载官方安装包。
  • 访问令牌有有效期,长连接场景下要确保令牌自动刷新(比如Azure的DefaultAzureCredential会自动处理刷新)。
  • 不同云服务商的令牌获取逻辑略有差异,比如AWS RDS用boto3的generate_db_auth_token,GCP Cloud SQL用google.auth库获取,替换对应的令牌获取代码即可。

备注:内容来源于stack exchange,提问作者Reev Edd

火山引擎 最新活动