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

Azure Databricks中使用JDBC连接Azure SQL数据库报错求助

解决Databricks连接Azure SQL Server的SQLAlchemy URL解析错误

问题背景

在Databricks集群的JDBC/ODBC高级选项中看到以下配置:

Server host name: XX
Port: 443
Protocol: HTTPS
HTTP path: sql/protocolv1/o/11673698219XXXXX/0714-XXXXX-XXXXXXXX
JDBC URL: 2.6.25 or later
and a URL

尝试连接自有Azure SQL Server并获取数据,使用的Python代码如下:

import os
import urllib.parse
import sqlalchemy

def get_azure_sql():
     mssql_server = os.getenv("MSSQL_SERVER")
     mssql_database = os.getenv("MSSQL_DATABASE")
     mssql_username = os.getenv("MSSQL_USERNAME")
     mssql_password = os.getenv("MSSQL_PASSWORD")
     mssql_port = os.getenv("MSSQL_PORT")
     mssql_driver = os.getenv("MSSQL_DRIVER")
    
    connection_url = f"""jdbc:sqlserver://{mssql_server}:{mssql_port};
database={mssql_database};user={mssql_username}@XXXX;
password{mssql_password};encrypt=true;
trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"""
    
    params = urllib.parse.quote_plus(connection_url)
    conn_str = f"""jdbc:sqlserver:///?autocommit=true&serverNameAsDNS=true&odbc_connect={params}"""
    engine = sqlalchemy.create_engine(conn_str)
    return engine

engine = get_azure_sql()

with engine.connect() as conn:
    data = conn.execute("SELECT TOP 10 * FROM [dbo].[Copy_of_Results]")

执行后出现错误:

Could not parse SQLAlchemy URL from string 'jdbc:sqlserver:///?autocommit=true&serverNameAsDNS=true&odbc_connect=jdbc%3Asqlserver%3A%2F%2F{server_name}%3A1433%3Bdatabase%3D{database}%3Buser%3D{username}%40{XXXX}%3Bpassword%3D87BeVo%40Zh8EZgNk9qNhEJe-%40%3B%0A++++++++++++++++++++encrypt%3Dtrue%3BtrustServerCertificate%3Dfalse%3BhostNameInCertificate%3D%2A.database.windows.net%3BloginTimeout%3D30%3B'

问题分析与修复方案

核心问题

  1. URL格式嵌套错误:将完整JDBC URL作为odbc_connect参数传入,重复嵌套了JDBC前缀,导致SQLAlchemy无法解析。
  2. 语法错误:password{mssql_password}缺少等号,应为password={mssql_password}。
  3. 无效字符引入:多行字符串的换行和缩进被保留到最终URL中,产生无效的换行符和空格。

修正后的代码

import os
import urllib.parse
import sqlalchemy

def get_azure_sql():
    mssql_server = os.getenv("MSSQL_SERVER")
    mssql_database = os.getenv("MSSQL_DATABASE")
    mssql_username = os.getenv("MSSQL_USERNAME")
    mssql_password = os.getenv("MSSQL_PASSWORD")
    mssql_port = os.getenv("MSSQL_PORT", "1433")  # Azure SQL默认端口为1433
    
    # 构建ODBC连接参数(无需jdbc前缀)
    odbc_params = {
        "server": f"{mssql_server},{mssql_port}",
        "database": mssql_database,
        "user": f"{mssql_username}@{mssql_server.split('.')[0]}",  # 取SQL Server前缀部分
        "password": mssql_password,
        "encrypt": "true",
        "trustServerCertificate": "false",
        "hostNameInCertificate": "*.database.windows.net",
        "loginTimeout": "30"
    }
    # 拼接并编码ODBC字符串
    odbc_str = ";".join([f"{k}={v}" for k, v in odbc_params.items()])
    encoded_odbc_str = urllib.parse.quote_plus(odbc_str)
    
    # 使用SQLAlchemy支持的mssql+pyodbc格式
    conn_str = f"mssql+pyodbc:///?odbc_connect={encoded_odbc_str}"
    engine = sqlalchemy.create_engine(conn_str)
    return engine

engine = get_azure_sql()

with engine.connect() as conn:
    data = conn.execute("SELECT TOP 10 * FROM [dbo].[Copy_of_Results]")
    # 可选:打印结果验证连接成功
    for row in data:
        print(row)

关键修正说明

  • 驱动前缀替换:用mssql+pyodbc://替代jdbc:sqlserver://,这是SQLAlchemy连接Azure SQL的标准格式。
  • 修复密码参数:补全密码参数的等号,确保语法正确。
  • 避免URL嵌套:直接构建ODBC参数字符串,而非传入完整JDBC URL。
  • 清除无效字符:用字典拼接参数,避免多行字符串带来的换行和空格。
  • 用户名格式修正:Azure SQL用户名需为username@server前缀,从服务器域名中提取前缀部分即可。

额外检查项

  • 确保Databricks集群已安装pyodbc和sqlalchemy库,未安装则通过集群库管理添加。
  • 验证环境变量MSSQL_SERVER(完整域名如xxx.database.windows.net)、MSSQL_DATABASE等配置正确。
  • 检查Azure SQL Server防火墙规则,允许Databricks集群的IP地址访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:50:29