Python Can';t打开lib';SQL Server';的ODBC驱动程序13;?符号链接问题?

Python Can';t打开lib';SQL Server';的ODBC驱动程序13;?符号链接问题?,python,pyodbc,Python,Pyodbc,当我尝试使用pyodbc(在mac上)连接到sql server数据库时: 我得到以下错误: 错误:('01000',“[01000][unixODBC][Driver Manager]无法打开lib'ODBC Driver 13 for SQL Server':找不到文件(0)(SQLDriverConnect)”) 在实际驱动程序位置中输入路径时: driver='/usr/local/lib/libmsodbcsql.13.dylib' 它开始工作了 我的odbcinst.ini如下所示

当我尝试使用pyodbc(在mac上)连接到sql server数据库时:

我得到以下错误:

错误:('01000',“[01000][unixODBC][Driver Manager]无法打开lib'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,如果有帮助的话?

运行:

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

这就解决了问题。

在我的例子中,我必须将
pyodbc
数据库驱动程序字符串更改为
driver='{ODBC驱动程序17 for SQL Server}'


实际上,在我的python代码中,pyodbc预期的是ODBC驱动程序13,但是,由于ODBC驱动程序版本更新(由于ubuntu更新)到当前版本,问题已经出现。

在我的情况下,我有一个Mac OS,以下命令修复了问题:

brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql mssql-tools
注1: 您可能需要提前将
unixodbc
安装到
msodbcsql
mssql工具
,如下所示:

brew install unixodbc
注2: 如果您还没有缺少的macOS软件包管理器
brew
,则可以从此处安装:

注意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

我必须补充一点,如果您使用的是另一个驱动程序(FreeTDS),并且在您的连接字符串中没有提到它,那么它将默认为
driver='{ODBC driver 17 for SQL Server}
或类似的内容

因此,解决方案是不要忘记驱动程序,DB设置如下所示:

“默认值”:{
“引擎”:“sql_server.pyodbc”,
“主机”:“127.0.0.1”,
“名称”:“mydb”,
“端口”:“1433”,
'USER':'sa',
“密码”:“****”,
“选项”:{
“驱动程序”:“FreeTDS”,
“主机是服务器”:True,
}
}

在我的案例中,我通过以下三个步骤修复了问题:

# 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

我尝试从外部(Linux)计算机建立到部署在(Windows)计算机上的远程MS SQL Server的连接。我花了一些时间才意识到您需要首先在尝试建立连接的机器上安装驱动程序(在我的例子中是Linux)


如果您使用的是macOS/Linux,那么您需要做的就是简单地按照特定操作系统的说明进行操作。

安装在Ubuntu 18.04上。我不确定是否需要导出两个
/bash\u配置文件
/bashrc
,但我没有时间检查

sudo apt-get update
ACCEPT_EULA=Y sudo apt-get -y install msodbcsql17 mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile \
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc \
sudo apt-get -y install unixodbc libc6 libstdc++6 libkrb5-3 libcurl3 openssl debconf unixodbc unixodbc-dev
然后作为连接中的驱动程序,使用与当前Azure版本匹配的SQL Server的ODBC驱动程序17

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驱动程序,一切都会就绪。

我在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"]

很好的解决方案-回答你的问题。unixODBC默认在
/etc
中搜索
odbcinst.ini
。它还将检查用户的主目录中是否有
.odbc.ini
.odbcinst.ini
。(FreeTDS对
FreeTDS.conf
/
.FreeTDS.conf
,记录在案)这是有效的(虽然我必须卸载并重新安装驱动程序),但有一个小错误:
sudo ln-s/usr/local/etc/odbc.ini/etc/odbc.ini
如果更新到新版本的驱动程序,也会发生此错误。如果存在该文件,请检查/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,然后更新scipt的内容以使用新的驱动程序。在这种情况下,驱动程序从版本13更新为版本17。我建议您添加此信息以确保完整性。ln:未能创建符号链接“/etc/odbcinst.ini”:文件存在文件存在错误意味着/etc文件夹中已存在odbcinst.ini。将文件重命名为odbcinst.ini_old,然后再次尝试ln-s命令,看看是否有效非常感谢您的快速修复(Y)我还必须在连接设置
connection=pyodbc.connect中添加驱动程序详细信息(“driver={ODBC driver 13 for SQL Server};”“Server=someHost;”“Database=dbname;”“uid=SA;pwd=passowrd”)
这已过时,因为brew不再支持--no sandbox选项(从2019年开始)。安装的修复程序是删除该选项。请参阅@A.Rabus,谢谢您的评论。帖子将根据您的建议进行更新。我们将在几个小时后进行演示,我的程序将无法在mac上运行。这救了我们的命。对我有效:
driver={ODBC driver 17 for SQL Server};
在SQL Server 2019上工作-driver={ODBC driver 17 for SQL Server};您是救命稻草“Microsoft ODBC驱动程序for SQL Server for linux/macos”链接非常有用,谢谢
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"]