首页 文章

PyODBC:即使它存在也无法打开驱动程序

提问于
浏览
16

我是linux世界的新手,我想从Python查询Microsoft SQL Server . 我在Windows上使用它,它非常好,但在Linux中它非常痛苦 .

几个小时后,我终于成功使用unixODBC在Linux Mint上安装Microsoft ODBC驱动程序 .

然后,我 Build 了一个带有python 3环境的anaconda .

然后我这样做:

import pyodbc as odbc

sql_PIM = odbc.connect("Driver={ODBC Driver 13 for SQL Server};Server=XXX;Database=YYY;Trusted_Connection=Yes")

它返回:

('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0' : file not found (0) (SQLDriverConnect)")

我没有遗忘的是,PyODBC似乎从odbcinst.ini读取了正确的文件路径,但仍然无法正常工作 .

我去了“/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0”,文件确实存在!

那为什么它告诉我它不存在?以下是一些可能的线索:

  • 我在虚拟环境中

  • 我需要"read"权限,因为它是根文件路径

我不知道如何解决这些问题 .

谢谢 !

7 回答

  • 4

    我找到了一个适合我的答案here . 这是针对python 2.7的(因此可能不适用于那些正在寻找python 3.x解决方案的人) .

    建议的解决方案是更新libgcc:4.8.5-2 - > 5.2.0-0

    要更新libgcc,请使用此命令

    conda update libgcc
    
  • 2

    在按照SQL Server Linux ODBC Driver的微软教程后,我在Ubuntu 14上也遇到了同样的问题 .

    该文件存在,运行ldd后,显示缺少依赖项:

    /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0:/ usr / lib / x86_64-linux-gnu / libstdc .so.6:版本 GLIBCXX_3.4.20' not found (required by /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0) /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version CXXABI_1.3.8'未找到(由

    经过一段时间的搜索,我找到了它,因为Ubuntu的repo在版本3.4.20上没有GLIBCXX,它是在3.4.19 .

    然后我向Ubuntu添加了一个repo,更新了它并强制它升级libstdc 6

    sudo add-apt-repository ppa:ubuntu-toolchain-r/test 
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install libstdc++6
    

    问题解决了,用isql测试:

    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    SQL>
    

    之后我尝试使用pdo_odbc(PHP)进行测试,然后它给了我相同的驱动程序未找到错误 . 要解决这个问题,我必须创建一个符号链接来修复 libodbcinst.so.2

    sudo ln -s /usr/lib64/libodbcinst.so.2 /lib/x86_64-linux-gnu/libodbcinst.so.2
    
  • 1

    我在MAC OS上遇到了同样的问题 'file not found (0) (SQLDriverConnect)' ,代码如下

    cnxn = pyodbc.connect('DRIVER = {用于SQL Server的ODBC驱动程序13}; SERVER = myServerIP,1433; DATABASE = myDBName; UID = sa; PWD = dbPassword')

    谷歌搜索两天后,即使修改了freetds.conf,odbcinst.ini和odbc.ini也无法解决问题

    最后,我通过替换 DRIVER 值找到了解决方案

    cnxn = pyodbc.connect('DRIVER = {/ usr / local / lib / libmsodbcsql.13.dylib}; SERVER = myServerIP,1433; DATABASE = myDBName; UID = sa; PWD = dbPassword')

    我的开发环境

    • MAC OS El Capitan
      在Anaconda中
    • python 3.6.1
  • 13

    以下建议可能有助于解决问题:

    • 确保驱动器配置INI文件存在 odbcinst -j (检查 odbcinst.ini ) .

    • 确保存在来自INI文件(运行: odbcinst -j )的已配置驱动程序的文件路径,并具有读取和可执行权限标志( O_RDONLY|O_CLOEXEC ) .

    • 如果仍然找不到文件错误,尽管文件存在,问题可能与 libgcc 版本不匹配有关nehaljwani's GitHub comment . 解决方案是通过运行 conda update libgcc 命令更新 libgcc .

    相关:在AWS E2 ubuntu实例上连接时,SQL Server的ODBC驱动程序13无法在pyodbc上打开lib .

  • 1

    曾经有过相同的问题.. 1.try conda update libgcc(这是因为通过pip和conda安装的pyodbc寻找不同版本的文件..)..这可能已经修复了.....链接:https://github.com/ContinuumIO/anaconda-issues/issues/1639寻找nehaljwani回答 .

    2.还要在/etc/odbcinst.ini和/etc/odbc.ini中正确检查odbc文件的版本号...名称应该匹配,还有驱动程序路径 .

  • 0

    我在安装libssl1.0.0后解决了这个问题 .

    首先,我以这种方式设置我的连接字符串:

    cnxn = pyodbc.connect('DRIVER={/usr/local/lib/libmsodbcsql.13.dylib};   
        SERVER=myServerIP,1433;DATABASE=myDBName;UID=sa;PWD=dbPassword')
    

    然后,我安装了libssl1.0.0:

    echo "deb http://security.debian.org/debian-security jessie/updates main" >> /etc/apt/sources.list
        apt-get install libssl1.0.0
    

    Finnaly,我设置了语言环境:

    apt-get -y install locales 
        echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
    

    完成这些步骤后,我的python模块能够找到并连接到数据库 .

  • 0

    也许有点晚了,但我留下了适合我的脚本 .

    我的问题和你的一样,我测试了所有的选项,比如更改驱动程序位置,制作符号链接,修改/etc/*.ini文件等等......没有用 .

    我的问题,在alpine的docker容器中运行python 3.6,pyodbc包是库 libssl1.0.0

    在这里,您将找到使用驱动程序v13的my installation script for pyodbc Debian 8 (alpine) docker image

    DRIVER = {SQL Server的ODBC驱动程序13}

    我为数据库连接运行的命令是:

    import pyodbc
    connection_string = 'DRIVER={ODBC Driver 13 for SQL Server};'
    connection_string += 'SERVER={0};DATABASE={1};UID={2};PWD={3};'.format(host,dbname,user,pwd)
    connection = pyodbc.connect(connection_string)
    

相关问题