pyodbc 问题:在 MacOS 上找不到 ODBC 驱动程序

问题描述 投票:0回答:3

我的环境

  • Python:3.9.7
  • pyodbc:4.0.32
  • 操作系统:MacOS 12.0.1、Apple M1 Max
  • 数据库:Azure SQL
  • 驱动程序:适用于 SQL Server 的 ODBC 驱动程序 17

跑步

import pyodbc

server   = 'myserver.database.windows.net'
database = 'mydb'
username = 'myuser'
password = 'mypassword'
odbc_driver = '{ODBC Driver 18 for SQL Server}'

conn_str = (
    f"Driver={odbc_driver};"
    f"Server=tcp:{server},1433;"
    f"Database={database};"
    f"Uid={username};"
    f"Pwd={password};"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
    "Connection Timeout=30;")

print(conn_str)

cnxn = pyodbc.connect(conn_str)

输出

Driver={ODBC Driver 18 for SQL Server};Server=tcp:myserver.database.windows.net,1433;Database=mydb;Uid=myuser;Pwd=mypassword;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;
Traceback (most recent call last):
  File "/Users/....", line 21, in <module>
    cnxn = pyodbc.connect(conn_str)
pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 18 for SQL Server' : file not found (0) (SQLDriverConnect)")

在 isql 中使用相同的连接字符串:

isql -v -k "Driver={ODBC Driver 18 for SQL Server};Server=tcp:<server>,1433;Database=<db>;Uid=<user>;Pwd=<pw>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;"

退货

Connected
并且可以查询

驱动程序在我的机器上,我先尝试使用

ODBC Driver 17 for SQL Server
,然后安装
ODBC Driver 18 for SQL Server
,结果相同。

我该如何解决这个问题?还创建了一个 GitHub 问题 here

python azure-sql-database pyodbc
3个回答
1
投票

错误:('01000',“[01000] [unixODBC][驱动程序管理器]无法打开 lib “SQL Server 的 ODBC 驱动程序 17”:找不到文件 (0) (SQLDriverConnect)”)

根据上述错误驱动程序正确未安装。但是,对于

ODBC Driver 17 for SQL server
,请按照官方文档在MacOS上安装Microsoft ODBC Driver for SQL Server

解决错误的另一种方法,检查您的驱动程序是否安装,然后按照驱动程序路径进行操作 示例 : "/user/local/lib/libmsodbcsql.17.dylib" ,替换 驱动程序值,如下面的代码所示。

cnxn = pyodbc.connect('DRIVER={/user/local/lib/libmsodbcsql.17.dylib};SERVER=ServerName,1433;DATABASE=DatabaseName;UID=Username;PWD=password')

参考:

https://docs.snowflake.com/en/user-guide/odbc-mac.html#installing-and-configuring-the-odbc-driver-for-macos


0
投票
/bin/bash -c "$(curl -fsSL 
https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew- 
mssql-release
brew update
brew install [email protected] [email protected]

这些命令完全适用于 MacOS。您可以在这里查看 https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver16


0
投票

TL;博士

尝试按照此答案本地安装 Homebrew https://stackoverflow.com/a/65383601/2103431。另外,请确保先卸载所有 msodbcsq 驱动程序、mssql-toolsunixodbc。通过这样做,您的 Homebrew 安装将进入文件夹

/opt/homebrew/
并防止任何复杂的链接问题。

如何检查Homebrew是否有问题?

  1. 您已根据故障排除
    Microsoft 说明
    链接了
    odbcinst.ini
    odbc.ini 文件。此外,您已尝试更改
    odbc.ini
    odbcinst.ini
    中的条目以指向您确定存在驱动程序的可执行版本的位置,但这没有帮助。

检查lib文件是否可执行的命令:

$ ls -la /usr/local/lib/libmsodbcsql.17.dylib
lrwxr-xr-x  1 localadmin  admin  64  7  4 16:38 /usr/local/lib/libmsodbcsql.17.dylib -> /usr/local/Cellar/msodbcsql17/17.1.0.1/lib/libmsodbcsql.17.dylib
  1. 运行
    odbcinst -j
    时,输出中的文件引用以
    /Users/<your_username>/
    /usr/local/
    开头。

$ odbcinst -j

unixODBC 2.3.12
DRIVERS............: /Users/<your_username>/.Homebrew/<more_dirs>/odbcinst.ini
SYSTEM DATA SOURCES: /Users/<your_username>/.Homebrew/<more_dirs>/odbc.ini
FILE DATA SOURCES..: /Users/<your_username>/.Homebrew/<more_dirs>/ODBCDataSources
USER DATA SOURCES..: /Users/<your_username/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

如何知道问题出在Python之外?

使用 CLI

isql
客户端测试数据库连接。

isql -v -k 'DRIVER={ODBC Driver <driver_version/13/17/18> for SQL Server};SERVER=<server_name>.database.windows.net;PORT=1443;DATABASE=<db_name>;UID=<db_user>;PWD=<db_pass>'

使用

isql
应该会产生与 Python 脚本相同的错误。

[01000][unixODBC][Driver Manager]Can't open lib '/Users/Konstantin.Grigorov/Desktop/libmsodbcsql.17.dylib' : file not found
[ISQL]ERROR: Could not SQLDriverConnect

解决方案:

如果满足上述所有条件,很可能您的问题是您在 Apple M1 Max 芯片上使用 Homebrew,并且需要在本机安装它。 完成 Homebrew 重新安装后,您可以检查

isql
是否能够连接到数据库。

要使 Python 脚本正常工作,您可能需要使用 Homebrew 重新安装 Python。我会选择 Python 3.11 版本。

安装 pyodbc 库时,请使用

--no-binary
标志。

pip install --no-binary :all: pyodbc

无法在 Apple Silicon 上导入 pyodbc - 找不到符号:_SQLAllocHandle

© www.soinside.com 2019 - 2024. All rights reserved.