MacBook Pro M1 Pro环境下pyodbc及驱动安装与SQL连接故障求助
解决M1 Pro Mac上pyodbc连接SQL Server的问题
一、统一ARM64架构的环境依赖
M1 Pro为ARM64架构,需确保所有依赖适配该架构,避免x86版本导致的库文件异常:
- 先确认Homebrew为ARM版(路径应为
/opt/homebrew),若当前是x86版(路径/usr/local),需重新安装ARM版Homebrew - 安装适配ARM的unixODBC:
brew install unixodbc - 验证unixODBC配置路径:
输出的odbcinst -jDRIVERS和SYSTEM DATA SOURCES路径需指向/opt/homebrew/etc/目录,确认是ARM版本的配置
二、安装适配ARM的微软ODBC驱动
微软已提供ARM版ODBC驱动17/18,放弃无ARM支持的Driver13:
安装ODBC Driver 18 for SQL Server(推荐)
brew install msodbcsql18 mssql-tools18
安装后手动注册驱动到系统配置:
cat << EOF >> /opt/homebrew/etc/odbcinst.ini [ODBC Driver 18 for SQL Server] Description=Microsoft ODBC Driver 18 for SQL Server Driver=/opt/homebrew/lib/libmsodbcsql.18.dylib UsageCount=1 EOF
验证驱动是否注册成功:
odbcinst -q -d -n "ODBC Driver 18 for SQL Server"
输出驱动信息即为安装成功
三、针对不同错误调整连接字符串
1. 解决ODBC Driver 18的SSL证书验证失败
Driver18默认强制SSL验证,若为内部自签证书或无需SSL,添加TrustServerCertificate=yes参数:
import pyodbc conn_str = ( "DRIVER={ODBC Driver 18 for SQL Server};" "SERVER=你的SQL服务器地址,端口;" # 示例:192.168.1.100,1433 "DATABASE=目标数据库名;" "UID=数据库账号;" "PWD=数据库密码;" "TrustServerCertificate=yes;" ) conn = pyodbc.connect(conn_str)
若需强制验证证书,将服务器CA证书导入macOS钥匙串,连接字符串保留默认Encrypt=yes即可
2. 解决ODBC Driver 17的登录失败
- 若使用SQL账号登录,检查账号密码正确性,同时添加
TrustServerCertificate=yes(内部服务器场景):conn_str = ( "DRIVER={ODBC Driver 17 for SQL Server};" "SERVER=你的SQL服务器地址,端口;" "DATABASE=目标数据库名;" "UID=数据库账号;" "PWD=数据库密码;" "TrustServerCertificate=yes;" ) - 若使用Windows域账号,需确保Mac已加入公司域,连接字符串改用
Trusted_Connection=yes - 额外检查:SQL Server防火墙是否允许当前Mac IP访问,SQL Server是否开启混合模式认证(SQL账号场景)
3. 解决Driver13库文件找不到问题
Driver13无ARM版本,直接替换为Driver17/18的ARM版即可
四、验证pyodbc与驱动的兼容性
由于你是源码安装pyodbc,需确认编译时链接了ARM版unixODBC:
- 找到pyodbc的安装文件路径:
pip3 show pyodbc | grep Location - 检查链接的库:
输出需包含otool -L /path/to/pyodbc.cpython-39-darwin.so/opt/homebrew/lib/libodbc.2.dylib,若为x86路径,需重新安装pyodbc:pip3 uninstall pyodbc export PATH="/opt/homebrew/bin:$PATH" export LDFLAGS="-L/opt/homebrew/lib" export CPPFLAGS="-I/opt/homebrew/include" pip3 install --no-binary :all: pyodbc
内容的提问来源于stack exchange,提问作者Davide Motta
相关产品推荐
相关产品推荐

