无法打开库 'ODBC Driver 13 for SQL Server'?符号链接问题?
Can't open lib 'ODBC Driver 13 for SQL Server'? Sym linking issue?
当我尝试使用 pyodbc 连接到 sql 服务器数据库时(在 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)
我收到以下错误:
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 13 for SQL Server' : file not found (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}'
的引用以重新开始工作?
我最初使用this guide安装驱动程序。我在 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 认为它们在那里)我为每个文件创建了一个符号 link:
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 Driver 17 for SQL Server}'
实际上,在我的 python 代码中 pyodbc 期待 ODBC 驱动程序 13 但是,随着 ODBC 驱动程序版本的更新(因为 ubuntu 更新)到当前版本 ODBC 驱动程序 17,问题发生了。
在我的例子中,我有一个 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-tools
,如下所示:
brew install unixodbc
注2:
如果您还没有brew
,Mac 的缺少包管理器OS,那么您可以从这里安装它: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
我必须补充一点,如果您使用不同的驱动程序 (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,
}
}
就我而言,我通过以下三个步骤解决了问题:
# 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 服务器的连接。我花了一些时间才意识到您需要先在 尝试建立连接 的机器上安装驱动程序(即在我的例子中是 Linux)!
如果您正在使用 macOS/Linux,您需要做的只是 Install the Microsoft ODBC Driver for SQL Server on Linux and macOS and then follow instructions on Connecting to databases 用于您的特定 OS。
在 Ubuntu 18.04 上运行的安装。我不确定是否需要 ./bash_profile
和 ./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 版本匹配的 ODBC Driver 17 for SQL Server
。
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"]
我知道每个人都有同样的愚蠢错误:但我提醒一下,我花了 30 分钟才阅读这个分支...连接字符串末尾的错误很奇怪 space
SQLALCHEMY_DATABASE_URI: str = "mssql+pyodbc://sa:tt@localhost:1433/babylon_pacemaker?Trusted_connection = no&driver=ODBC+Driver+17+for+SQL+Server " - odd space :(
有趣的是 Alembic 运行良好,但 SQLAlchimy 有错误。
我也遇到过类似的问题。
首先,我关注了this instruction:
我认为错误在于我使用了驱动程序 17 而不是驱动程序 13 - 根据 Azure 门户中可见的连接字符串。
玩了很久,13号驱动报错:
" pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]无法打开 lib '/usr/local/lib/libmsodbcsql.13.dylib': 找不到文件 (0) (SQLDriverConnect )") "
并收到驱动程序 17 的超时错误。
我终于在 this hack 中找到了解决方案。问题是 OpenSSL 混淆了两个版本。
我 运行 我 Mac 上 VS Code 中的虚拟环境中的应用程序,并将其部署到 Azure Web 应用程序。
我只是在 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://docs.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"]
在代码中设置连接时,您需要指定您安装的驱动程序版本。例如在我的 case: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)
当我尝试使用 pyodbc 连接到 sql 服务器数据库时(在 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)
我收到以下错误:
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 13 for SQL Server' : file not found (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}'
的引用以重新开始工作?
我最初使用this guide安装驱动程序。我在 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 认为它们在那里)我为每个文件创建了一个符号 link:
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 Driver 17 for SQL Server}'
实际上,在我的 python 代码中 pyodbc 期待 ODBC 驱动程序 13 但是,随着 ODBC 驱动程序版本的更新(因为 ubuntu 更新)到当前版本 ODBC 驱动程序 17,问题发生了。
在我的例子中,我有一个 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-tools
,如下所示:
brew install unixodbc
注2:
如果您还没有brew
,Mac 的缺少包管理器OS,那么您可以从这里安装它: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
我必须补充一点,如果您使用不同的驱动程序 (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,
}
}
就我而言,我通过以下三个步骤解决了问题:
# 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 服务器的连接。我花了一些时间才意识到您需要先在 尝试建立连接 的机器上安装驱动程序(即在我的例子中是 Linux)!
如果您正在使用 macOS/Linux,您需要做的只是 Install the Microsoft ODBC Driver for SQL Server on Linux and macOS and then follow instructions on Connecting to databases 用于您的特定 OS。
在 Ubuntu 18.04 上运行的安装。我不确定是否需要 ./bash_profile
和 ./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 版本匹配的 ODBC Driver 17 for SQL Server
。
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"]
我知道每个人都有同样的愚蠢错误:但我提醒一下,我花了 30 分钟才阅读这个分支...连接字符串末尾的错误很奇怪 space
SQLALCHEMY_DATABASE_URI: str = "mssql+pyodbc://sa:tt@localhost:1433/babylon_pacemaker?Trusted_connection = no&driver=ODBC+Driver+17+for+SQL+Server " - odd space :(
有趣的是 Alembic 运行良好,但 SQLAlchimy 有错误。
我也遇到过类似的问题。
首先,我关注了this instruction:
我认为错误在于我使用了驱动程序 17 而不是驱动程序 13 - 根据 Azure 门户中可见的连接字符串。
玩了很久,13号驱动报错: " pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]无法打开 lib '/usr/local/lib/libmsodbcsql.13.dylib': 找不到文件 (0) (SQLDriverConnect )") "
并收到驱动程序 17 的超时错误。
我终于在 this hack 中找到了解决方案。问题是 OpenSSL 混淆了两个版本。
我 运行 我 Mac 上 VS Code 中的虚拟环境中的应用程序,并将其部署到 Azure Web 应用程序。
我只是在 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://docs.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"]
在代码中设置连接时,您需要指定您安装的驱动程序版本。例如在我的 case: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)