Pyodbc 在非 conda python 中工作,但无法在 conda 中加载驱动程序



我有一个简单的连接字符串,用于连接到在本地 docker 容器中运行的 MSSQL 服务器。该代码在python 3.7(不是conda(中运行良好,但在任何conda环境中都失败。我特别感兴趣的是让它在Jupyter笔记本中工作。

我最近重新安装了 Anaconda,但这似乎无关紧要,因为它仍然不起作用。我的.bash_profile似乎有点乱,但在我确定自己在做什么之前,我一直不愿意在那里进行更改。

据我所知,我的 conda 版本的 python 找不到其他版本的 python 正在使用的 pyodbc 驱动程序。

对我来说,这段代码适用于任何非 conda 版本的 Python,但在其他地方失败。

import pyodbc
drivers = [item for item in pyodbc.drivers()]
driver = drivers[-1]
print("driver:{}".format(driver))
server = '192.168.0.4'
database = 'XXXXXXX'
uid = 'sa'
pwd = 'XXXXXXXXXX'
con_string = f'DRIVER={driver};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd}'
print(con_string)
cnxn = pyodbc.connect(con_string)

cursor = cnxn.cursor()
print('connected')
cursor.execute('SELECT * FROM TB_STYLE_AUDIT')
for row in cursor:
    print(row)

预期成果(缩短(:

/usr/local/bin/python3.7 /Users/mycomputer/Documents/Pythonprojects/BuildingOldHistory/getHistoricaldata.py
driver:ODBC Driver 17 for SQL Server
DRIVER=ODBC Driver 17 for SQL Server;SERVER=192.168.0.4;PORT=1433;DATABASE=XXXXXXX;UID=sa;PWD=XXXXXXX
connected
(37962, 107, 555255, 662895, 689233, datetime.datetime(2016, 6, 8, 13, 22, 38), 1, '', '', '', -1.0, -10.0, -20.0, 'Sale', '1086504', '1088527', None, 18, None)

这是来自康达的错误:

IndexError                                Traceback (most recent call last)
<ipython-input-1-ea3728340faa> in <module>
      2 
      3 drivers = [item for item in pyodbc.drivers()]
----> 4 driver = drivers[-1]
      5 print("driver:{}".format(driver))
      6 server = '192.168.0.4'
IndexError: list index out of range

编辑以添加此代码也可以在 conda 之外工作:

import pyodbc
#drivers = [item for item in pyodbc.drivers()]
#driver = drivers[-1]
#print("driver:{}".format(driver))
driver = 'ODBC Driver 17 for SQL Server'
server = '192.168.0.4'
database = 'XXXXXXX'
uid = 'sa'
pwd = 'XXXXXXX'
con_string = f'DRIVER={driver};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd}'
print(con_string)
cnxn = pyodbc.connect(con_string)

cursor = cnxn.cursor()
print('connected')
cursor.execute('SELECT * FROM TB_STYLE_AUDIT')
for row in cursor:
    print(row)

但在笔记本中产生此错误:

---------------------------------------------------------------------------
Error                                     Traceback (most recent call last)
<ipython-input-2-3f7d96055440> in <module>
     11 con_string = f'DRIVER={driver};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd}'
     12 print(con_string)
---> 13 cnxn = pyodbc.connect(con_string)
     14 
     15 
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")

对我来说,这是一个系统链接断开的问题。我按照这个修复了它。

运行这个修复了它:

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

如果是 OSX,请按照驱动程序和驱动程序管理器中的说明进行操作。在OS X上安装FreeTDS,unixODBC和pyodbc也很有帮助

关键问题是配置文件,如下所示:

在驱动程序和实例上,编辑/usr/local/etc/odbcinst.ini:

[FreeTDS]
Description=FreeTDS Driver for Linux & MSSQL
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsodbc.so
UsageCount=1
[unixodbc]
Description=unixodbc
ODBCInstLib=/usr/local/Cellar/unixodbc/2.3.1/lib/libodbcinst.dylib
DriverManagerEncoding=UTF-16

测试日志:

$ python
Python 3.6.8 |Anaconda, Inc.| (default, Dec 29 2018, 19:04:46) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyodbc
>>> pyodbc.drivers()
['FreeTDS', 'unixodbc']
>>> 
在这里,

我们如何在不对 Linux 系统进行任何更改的情况下设法使用 conda。也许相同的指令适用于Windows和MAC:在这种情况下不是testet(

让我们从使用 conda 创建一个环境开始:

# conda create -n myodbc python=3.9
# conda activate myodbc
# conda install pyodbc psycopg psqlodbc

检查目录是否可用:

ls $CONDA_PREFIX/lib/psql*
outputs should have one ansi binary and one unicode binary
$CONDA_PREFIX/lib/psqlodbca.so  $CONDA_PREFIX/lib/psqlodbcw.so

如果案例安装正确,我们现在需要在 conda env 中设置一些 env 变量以确保ODBCINST 工具链接到正确的驱动程序。我们设置了两个 env 变量ODBCINIODBCSYSINI

conda env config vars set ODBCSYSINI="$CONDA_PREFIX/etc" ODBCINI="$CONDA_PREFIX/etc/pgsql_odbc.ini"

对于激活变量,请停用 conda 并再次激活:

conda deactivate
conda activate myodbc

在这种情况下,将为指定的驱动程序创建数据源文件,PostgreSQL ODBC dirver(unicode 版本(:

echo -e "[PostgreSQL]ndescription = PostgreSQL ODBC driver (Unicode version)ndriver = $CONDA_PREFIX/lib/psqlodbcw.sondebug = 0nusagecount = 1" > $CONDA_PREFIX/etc/pgsql_odbc.ini

在安装之前显示 odbc 驱动程序和数据源的配置的 ODBC 驱动程序文件:

安装pgsql_odbc.ini:

odbcinst -i -d -f $CONDA_PREFIX/etc/pgsql_odbc.ini

然后再次检查驱动程序是否已链接到 ini 和二进制文件的正确路径

odbcinst -j

最新更新