无法打开lib 'ODBC Driver 13 for SQL Server'?符号链接问题?

91
当我尝试使用pyodbc连接到SQL Server数据库(在Mac上)时:
import pyodbc

server = '####'
database = '####'
username = '####@####'
password = '#####'
driver='{ODBC Driver 13 for SQL Server}'

pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1443;DATABASE='+database+';UID='+username+';PWD='+password)

我遇到了以下错误:
错误:('01000',“[01000] [unixODBC] [驱动程序管理器]无法打开库'ODBC Driver 13 for SQL Server':找不到文件(0)(SQLDriverConnect)”)
当我使用实际驱动程序位置时:
driver='/usr/local/lib/libmsodbcsql.13.dylib'

它开始工作了!

我的 odbcinst.ini 文件看起来像这样:

[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/usr/local/lib/libmsodbcsql.13.dylib
UsageCount=1

我怎样才能让我的引用driver='{ODBC Driver 13 for SQL Server}'重新工作呢?

我最开始使用这篇指南来安装驱动程序。如果有帮助的话,我是在Mac Sierra上使用Anaconda。

15个回答

94

运行中:

odbcinst -j

它得出了:

unixODBC 2.3.4
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /Users/emehex/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

我没有将文件复制到/etc/目录中(不确定为什么unixODBC认为它们在那里),而是创建了每个文件的符号链接:


sudo ln -s /usr/local/etc/odbcinst.ini /etc/odbcinst.ini
sudo ln -s /usr/local/etc/odbc.ini /etc/odbc.ini

这解决了问题。


2
很好的解决方案 - 回答你的问题。unixODBC默认在/etc中搜索odbc.iniodbcinst.ini。它还会检查用户的主目录下是否存在.odbc.ini.odbcinst.ini。(顺便说一句,FreeTDS也会在freetds.conf / .freetds.conf中执行相同的操作。) - FlipperPA
9
这个方法可行(尽管我不得不先卸载再重新安装驱动程序 https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server),但有一个小错误:```sudo ln -s /usr/local/etc/odbc.ini /etc/odbc.ini```。 - alexvicegrab
2
如果您已更新到新版本的驱动程序,则可能会出现此错误。如果字段存在,请检查/etc/odbcinst.ini的内容例如:$ cat /etc/odbcinst.ini [ODBC Driver 17 for SQL Server] Description=Microsoft ODBC Driver 17 for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-17.0.so.1.1 UsageCount=1然后更新脚本内容以使用新驱动程序。在这种情况下,驱动程序从版本13更新到版本17。我建议您添加此信息以完整性。 - earnshae
35
ln:无法创建符号链接'/etc/odbcinst.ini':文件已存在 - Sheshank S.
2
文件存在错误意味着odbcinst.ini已经存在于/etc文件夹中。将该文件重命名为odbcinst.ini_old,然后再次尝试ln -s命令,看看是否有效。 - phill
显示剩余3条评论

60

在我的情况下,我使用的是Mac OS,以下命令解决了问题:

brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql mssql-tools

注意 1:在安装以下内容之前,可能需要先安装unixodbcmsodbcsqlmssql-tools

brew install unixodbc

注意2:如果你还没有安装MacOS的缺失软件包管理器brew,那么你可以从这里安装:https://brew.sh/

注意3:你可以像@emehex在上面提到的那样使用以下命令来验证你的安装:

odbcinst -j

sudo ln -s /usr/local/etc/odbcinst.ini /etc/odbcinst.ini
sudo ln -s /usr/local/etc/odbc.ini /etc/odbc.ini

1
非常感谢您的快速修复(Y) - eAlie
3
我也必须在连接设置中添加驱动程序详细信息 connection = pyodbc.connect("Driver={ODBC Driver 13 for SQL Server};" "Server=someHost;" "Database=dbname;" "uid=SA;pwd=passowrd") - eAlie
1
这已经过时了,因为自2019年初起,brew不再支持--no-sandbox选项。实施的修复方法是放弃该选项。请参见https://github.com/Microsoft/homebrew-mssql-release/issues/29。 - A. Rabus
2
我们几个小时后要做演示,但我的程序在Mac上无法运行。这真是救了我们的命。 - lueenavarro
1
谢谢@ReneB.,这个很好用。我发现我的代码更喜欢版本17而不是13。 - Ferhat
显示剩余3条评论

51

在我的情况下,我不得不更改pyodbc数据库驱动程序字符串为
driver='{ODBC Driver 17 for SQL Server}'

实际上,在我的Python代码中,pyodbc期望的是ODBC Driver 13。但由于ubuntu更新导致ODBC驱动程序版本更新为当前版本ODBC Driver 17,所以出现了问题。


5
对我来说没问题:driver={ODBC Driver 17 for SQL Server}; - Ralf Hundewadt
使用 SQL Server 2019 进行开发 - 驱动程序={ODBC Driver 17 for SQL Server}; - Jiraheta

19

在我的情况下,我通过以下三个步骤解决了问题:

# Step1: install unixodbc 
brew install unixodbc

# Step2: install Microsoft ODBC Driver for SQL Server on MacOS

brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql mssql-tools

# Step3:verify odbcinst configuration path is correct

odbcinst -j

sudo ln -s /usr/local/etc/odbcinst.ini /etc/odbcinst.ini
sudo ln -s /usr/local/etc/odbc.ini /etc/odbc.ini

4
请注意,对于 M1 Macs,上述符号链接可能无效。这是因为 M1 上的 Homebrew 目录为 /opt/homebrew,而不是 /usr/local。因此,路径应相应地进行调整。 - Dimitris Paraschakis
请确保更改 M1 Mac 的 Homebrew 路径。谢谢 @DimitrisParaschakis - mathisfun

7

我正在Python的基础上构建自定义镜像,这是使它工作的配置:

FROM python:3.8 as pyodbc

COPY . /app
WORKDIR /app

# Required for msodbcsql17 and mssql-tools
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update

# Key might change in the future, replace with new one on the logs
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA6932366A755776
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt-get update

RUN ACCEPT_EULA=Y apt-get install -y msodbcsql17 mssql-tools
RUN apt-get install unixodbc-dev

RUN pip install pipenv
RUN pipenv install --system --deploy

CMD [ "python" , "__init__.py"]

我得到了一个 404 未找到 [IP: 91.189.95.85 80] 的错误,你对此有什么想法吗? - MikeSchem
@MikeSchem 不是很确定。也许你可以发布一个新问题,并在其中提到我的名字或者链接到这里。 - Evandro Pomatti

5
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 
apt-get update
ACCEPT_EULA=Y apt-get install msodbcsql17
apt-get -y install unixodbc-dev
sudo apt-get install python3-pip -y
pip3 install --upgrade pyodbc

使用上述步骤正确安装odbc驱动程序,一切都会就位。

2
我必须补充说明,如果您使用不同的驱动程序(FreeTDS),并且在连接字符串中忘记提及它,那么默认将使用driver ='{ODBC Driver 17 for SQL Server}或类似的内容。
因此解决方案是不要忘记驱动程序,您的数据库设置应如下所示: 'default': { 'ENGINE': 'sql_server.pyodbc', 'HOST': '127.0.0.1', 'NAME': 'mydb', 'PORT': '1433', 'USER': 'sa', 'PASSWORD': '*****', 'OPTIONS':{ 'driver': 'FreeTDS', 'host_is_server': True, } }

2

1
“Microsoft ODBC Driver for SQL Server for Linux/macOS” 的链接很有帮助,谢谢。 - Loknar

1

我只是在python:3.7-alpine的基础上搭建了镜像。

FROM python:3.7-alpine

COPY . /app/.
WORKDIR /app

# Install curl
RUN apk add --no-cache curl
RUN apk update && apk add curl

# Install the Microsoft ODBC driver Linux.Follow the mssql documentation: https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15
RUN curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_17.8.1.1-1_amd64.apk
RUN curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/mssql-tools_17.8.1.1-1_amd64.apk

# Install the package(s)
RUN apk add --allow-untrusted msodbcsql17_17.8.1.1-1_amd64.apk
RUN apk add --allow-untrusted mssql-tools_17.8.1.1-1_amd64.apk

# Install other libs
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

RUN apk add python3 python3-dev g++ unixodbc-dev
RUN python3 -m ensurepip
RUN pip3 install --user pyodbc

# Run script
ENTRYPOINT [ "python", "-u", "run.py"]

在代码中设置连接时,您需要指定已安装的驱动程序版本。例如,在我的情况下:msdobcversion=17,所以驱动程序应为DRIVER={ODBC Driver 17 for SQL Server}

# Make connection
server = os.environ["server"]
database = os.environ["database"]
username = os.environ["UID"]
password = os.environ["PWD"]
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)

1
我遇到了类似的问题。
首先,我遵循了这个指导
我认为错误在于我使用了驱动程序17而不是Azure门户中可见的驱动程序13。
经过长时间的尝试,对于驱动程序13,出现了以下错误: “pyodbc.Error:('01000','[01000] [unixODBC] [Driver Manager]无法打开lib'/usr/local/lib/libmsodbcsql.13.dylib':文件未找到(0)(SQLDriverConnect))”
对于驱动程序17,则出现了超时错误。
最终,我在此处hack中找到了解决方案。问题出在OpenSSL上,两个版本混淆了。
我在我的Mac上在VS Code的虚拟环境中运行应用,并将其部署到Azure Web App中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接