无法打开库“ODBC Driver 17 for SQL Server”:找不到文件

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

我对 Python 和 Azure Web 应用程序相当陌生。 如有任何帮助,我们将不胜感激。

我的设置:

  • 程序:Visual Studio代码
  • 语言:Python-Flask
  • 云提供商:Microsoft Azure
  • 数据库:Azure SQL DB
  • 部署选项:Docker 映像 > Azure 容器注册表 > 将映像部署到 Web 应用程序
  • Web 应用操作系统:Linux(我认为是 Alpine?)

在我的代码中,我使用

pyodbc
连接到 Azure SQL DB。 代码在终端本地成功运行。 然而,当它在网络上运行时,遇到以下错误:

Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")

我遵循了几篇故障排除帖子,但是没有成功。

我尝试使用 $sudo ln 创建符号链接,但导致权限被拒绝。 我认为这是 Azure Web 应用程序的一个已知限制。

我尝试在 etc/odbcinst.ini 中查找驱动程序以查看驱动程序名称是否存在,但是,我对 Azure / VS Code 还很陌生,所以我什至不知道如何打开等中的文件/ 文件夹。 当我导航到 etc/ 文件夹时,我确实在 BASH 命令提示符中看到了它,但不确定如何打开该文件。

我在

BASH
中运行以下命令来安装
PYODBC
,但这并没有解决问题。

python -m pip install pyodbc

结果

odbcinst -j

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

我的docker文件:

# Pull a pre-built alpine docker image with nginx and python3 installed
FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7

ENV LISTEN_PORT=8000
EXPOSE 8000

COPY /app /app

# Uncomment to install additional requirements from a requirements.txt file
COPY requirements.txt /
RUN pip install --no-cache-dir -U pip
RUN pip install --no-cache-dir -r /requirements.txt

RUN apk add g++
RUN apk add unixodbc-dev
RUN pip install pyodbc

我的要求.txt。 我注释掉了

pyodbc
;我认为这没问题,因为我将其安装在 docker 文件中。

click==6.7
Flask==0.12.2
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
Werkzeug==0.14.1
#pyodbc==4.0.28

其他问题:

  1. 我应该使用 PYODBC 吗?或者我应该使用更好/更兼容的东西?
  2. 我应该使用 MYSQL 而不是 Azure SQL DB 吗?
  3. 我有办法打开网络应用程序上的
    odbcinst.ini
    文件吗?
python linux azure docker
4个回答
6
投票

首先,如果你想知道你的docker中是什么os版本,你可以通过命令

cat /etc/os-release
来获取它,比如在我的ubuntu中运行它,如下图。

enter image description here

在这里,我确定您的网络应用程序操作系统是 Alpine Linux,因为您的 docker 文件的第一行

FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7
。您的基础镜像基于 Alpine 3.7。

其次,根据您的错误信息

Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")
以及docker文件的内容和
requirements.txt
,我认为问题是由于缺少适用于Linux的MS SQL Server ODBC驱动程序引起的,该驱动程序未安装在您的docker映像中,但是
pyodbc 
需要它来连接 Azure SQL 数据库。

但是,对于

ODBC Driver 17 for SQL Server
,官方文档
Installing the Microsoft ODBC Driver for SQL Server on Linux and macOS
显示Alpine还没有发布v17包。因此,解决方法是将 DockerHub 基础映像从
tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7
更改为
tiangolo/uwsgi-nginx-flask:python3.6
以使用 debian 作为操作系统,然后您可以轻松地在其中安装适用于 SQL Server 的 MS ODBC 驱动程序 17。

对于您的其他问题,如下。

  1. 除了使用

    pyodbc
    之外,
    pymssql
    是Python SQL Driver的另一种,请参见官方文档
    Python SQL Driver
    ,但是
    The Pymssql Project is Being Discontinued
    。而
    SQLAlchemy
    作为ORM框架可以用来连接Azure SQL数据库,这也需要
    pyodbc
    pymssql

  2. 使用 MySQL 或 Azure SQL 数据库,由您决定。我认为唯一的区别是 MySQL 可能比 Alpine 中的 Azure SQL DB 安装更容易。

  3. 在 web 应用程序上打开

    odbcinst.ini
    文件的方法是使用 vim 通过 SSH 连接到您的 docker 操作系统。考虑到您使用的自定义 docker 镜像,请参阅官方文档 Enable SSH
    Configure a custom Linux container for Azure App Service
     部分,并将命令 
    apk
    替换为 Debian Linux 的
    apt


5
投票

官方网站上的以下说明帮助我解决了我的问题:Install the Microsoft ODBC driver for SQL Server (Linux)

curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

#Download appropriate package for the OS version
#Choose only ONE of the following, corresponding to your OS version

#Debian 8 (only supported up to driver version 17.6)
curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list

#Debian 9
curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list

#Debian 10
curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list

exit
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql17
# optional: for bcp and sqlcmd
sudo ACCEPT_EULA=Y apt-get install -y mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
# optional: for unixODBC development headers
sudo apt-get install -y unixodbc-dev
# optional: kerberos library for debian-slim distributions
sudo apt-get install -y libgssapi-krb5-2

0
投票

我在使用

Flex Consumption
plan 的 Azure Function App 中遇到了同样的错误。原因是因为在这个计划中,ODBC Driver 17不存在,而是ODBC Driver 18!

只需将驱动程序设置更改为

ODBC Driver 18 for SQL Server
即可修复该错误。

备注:

  • 如果您的 Function App 处于正常消费计划中,则“ODBC Driver 17”是最佳选择
  • 根据您的库,您将有不同的方式在连接字符串中配置驱动程序信息

-1
投票

官方网站的说明对我不起作用,因为包裹被报告为丢失:

$ sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package msodbcsql18

以下对我有用:

sudo apt-get install unixodbc

也可以使用浏览器导航:

https://packages.microsoft.com/ubuntu/21.04/prod/pool/main/m/

下载 deb 文件:

  • msodbcsql18
  • mssql-tools18

    或者
  • msodbcsql
  • msodbcsql17

选择您要安装的版本。我选了18。

安装两个 deb 文件:

sudo dpkg -i mssql-tools18_18.0.1.1-1_amd64.deb
sudo dpkg -i msodbcsql18_18.0.1.1-1_amd64.deb

如果您没有运行官方网站上的脚本,那么您需要运行以下命令(适用于 18 而不是 17):

echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
© www.soinside.com 2019 - 2024. All rights reserved.