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'
问题分析与修复方案
核心问题
- URL格式嵌套错误:将完整JDBC URL作为
odbc_connect参数传入,重复嵌套了JDBC前缀,导致SQLAlchemy无法解析。 - 语法错误:
password{mssql_password}缺少等号,应为password={mssql_password}。 - 无效字符引入:多行字符串的换行和缩进被保留到最终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
相关产品推荐
相关产品推荐

