无法从Google Colab连接远程SQL Server:驱动缺失及安装脚本失败求助
我在服务器上安装了SQL Server 2019,托管着MyDB数据库。尝试在Google Colab中通过以下代码连接数据库:
import urllib.parse import sqlalchemy params = urllib.parse.quote_plus('Driver={ODBC Driver 17 for SQL Server};' 'Server=0.tcp.in.ngrok.io,*****;' 'Database=MyDB;' 'Username=****;' 'Password=****;' 'Trusted_Connection=yes;') engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params)) cnxn = engine.connect()
执行后报错:
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")
之前用来安装驱动的脚本现在执行失败:
%%sh curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list sudo apt-get update sudo ACCEPT_EULA=Y apt-get -q -y install msodbcsql17
报错信息:
CalledProcessError: Command 'b'curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get -q -y install msodbcsql17
'' returned non-zero exit status 100.
需要解决驱动安装问题,成功连接到SQL Server。
问题出在旧脚本使用的Ubuntu 16.04源已停止维护,而当前Google Colab运行的是Ubuntu 22.04(或更高版本),导致源无法访问。替换为对应版本的源即可解决:
步骤1:安装适配Colab的ODBC驱动17
执行以下更新后的脚本:
%%sh curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/microsoft.gpg curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list > /etc/apt/sources.list.d/mssql-release.list sudo apt-get update sudo ACCEPT_EULA=Y apt-get -q -y install msodbcsql17 unixodbc-dev
- 用
gpg --dearmor替代apt-key add(apt-key已被官方废弃) - 替换源为Ubuntu 22.04版本,适配Colab当前系统
- 额外安装
unixodbc-dev,确保驱动依赖完整
步骤2:验证驱动安装结果
执行以下命令确认驱动已成功安装:
odbcinst -q -d -n "ODBC Driver 17 for SQL Server"
若输出驱动的路径信息,说明安装成功。
步骤3:调整连接代码并测试
注意:Colab是远程环境,Trusted_Connection=yes(Windows身份验证)无效,需改为Trusted_Connection=no,使用SQL Server账号密码验证:
import urllib.parse import sqlalchemy params = urllib.parse.quote_plus('Driver={ODBC Driver 17 for SQL Server};' 'Server=0.tcp.in.ngrok.io,*****;' 'Database=MyDB;' 'Username=****;' 'Password=****;' 'Trusted_Connection=no;') engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params)) # 测试连接 try: cnxn = engine.connect() print("连接成功!") except Exception as e: print(f"连接失败:{e}")
额外注意事项
- 确认ngrok隧道正常运行,端口转发配置正确
- SQL Server防火墙需允许ngrok的IP访问对应端口
- 确保所用SQL Server账号拥有
MyDB的访问权限
内容的提问来源于stack exchange,提问作者Sir Arthur7

