如何在Azure Databricks工作区安装ODBC Driver 17 for SQL Server并连接Azure SQL
在Azure Databricks中安装ODBC Driver 17 for SQL Server并连接Azure SQL Server
一、安装ODBC Driver 17 for SQL Server
Azure Databricks基于Ubuntu系统运行,需通过系统级命令安装ODBC驱动,有两种安装方式:
1. 集群级持久化安装(推荐)
此方式安装后,集群重启依然生效,适合长期使用场景:
- 编写初始化脚本(命名为
install_odbc.sh):#!/bin/bash sudo apt-get update sudo apt-get install -y msodbcsql17 unixodbc-dev - 将脚本上传至DBFS(例如路径
dbfs:/scripts/install_odbc.sh) - 进入集群配置页面,在初始化脚本模块添加该脚本路径,保存后重启集群即可完成持久化安装。
2. 笔记本临时安装(仅当前会话有效)
若仅需临时使用驱动,可在笔记本中直接运行以下命令:
%sh sudo apt-get update sudo apt-get install -y msodbcsql17 unixodbc-dev
二、修正连接Azure SQL Server的代码
你的原始代码存在驱动名称不完整、未处理数据库已存在的情况、未考虑Azure SQL创建数据库的异步延迟等问题,以下是修正后的完整代码:
%python %pip install pyodbc dbutils.library.restartPython() import pyodbc import time # Azure SQL连接配置 server = '<服务器名称>.database.windows.net' # 需添加Azure SQL完整后缀 database = 'master' username = 'admin_1' password = 'test&123' driver = 'ODBC Driver 17 for SQL Server' # 使用完整驱动名称 # 构建连接字符串 connection_string = f'DRIVER={driver};SERVER={server};PORT=1433;DATABASE={database};UID={username};PWD={password}' # 建立与master数据库的连接 conn = pyodbc.connect(connection_string) cursor = conn.cursor() # 创建新数据库(先检查是否已存在) new_db_name = 'NewDatabase' cursor.execute("SELECT name FROM sys.databases WHERE name = ?", new_db_name) if not cursor.fetchone(): cursor.execute(f"CREATE DATABASE {new_db_name}") conn.commit() print(f"数据库 {new_db_name} 创建成功!") # Azure SQL创建数据库为异步操作,需等待几秒再连接 time.sleep(10) else: print(f"数据库 {new_db_name} 已存在,无需重复创建。") # 连接到新创建的数据库 connection_string_new_db = f'DRIVER={driver};SERVER={server};PORT=1433;DATABASE={new_db_name};UID={username};PWD={password}' conn_new_db = pyodbc.connect(connection_string_new_db) print(f"成功连接到数据库 {new_db_name}!") # 关闭所有连接 cursor.close() conn.close() conn_new_db.close()
三、关键注意事项
- 网络访问:确保Azure Databricks集群的网络可访问Azure SQL Server,例如配置VNet对等、将集群IP添加至SQL Server防火墙白名单。
- 驱动名称:必须使用完整名称
ODBC Driver 17 for SQL Server,简写会导致驱动查找失败。 - SQL注入防护:对于用户可控的参数,建议使用参数化查询(如代码中检查数据库存在的语句),避免直接拼接SQL字符串。
- 异步延迟:Azure SQL创建数据库为异步操作,创建后需等待几秒再尝试连接,否则会出现连接失败。
内容的提问来源于stack exchange,提问作者ravipatel
相关产品推荐
相关产品推荐

