我是Linux世界的新手,我想从Python查询Microsoft SQL Server。我在Windows上使用它,它非常好,但在Linux中它非常痛苦。
几个小时后,我终于成功地在Linux Mint上安装了Microsoft ODBC驱动程序和unixODBC。
然后,我用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",文件实际上存在!
那么为什么它告诉我它不存在呢?以下是一些可能的线索:
- 我在虚拟环境中
- 我需要具有"读取"权限,因为它是根文件路径
我不知道如何解决这两个问题。
谢谢!
在遵循 SQL Server Linux ODBC 驱动程序的微软教程后,我在 Ubuntu 14 上也遇到了同样的问题。
该文件存在,运行 ldd 后,它显示缺少依赖项:
/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.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 的存储库在 3.4.20 版上没有 GLIBCXX,它是 3.4.19。
然后我向 Ubuntu 添加了一个存储库,更新了它并强制它升级 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
我在MAC OS上遇到了同样的问题"找不到文件(0)(SQLDriverConnect)",代码如下
cnxn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER=myServerIP,1433;DATABASE=myDBName;UID=sa;PWD=dbPassword')
谷歌搜索两天后,我甚至无法修复这个问题,甚至修改freetds.conf,odbcinst.ini和odbc.ini
最后,我通过替换驱动程序值找到了解决方案
CNXN = pyodbc.connect('DRIVER={/usr/local/lib/libmsodbcsql.13.dylib};SERVER=myServerIP,1433;DATABASE=myDBName;UID=sa;PWD=dbPassword')
我的开发环境
- MAC OS El Capitan
- 蟒蛇 3.6.1 in Anaconda
我在这里找到了一个适合我的答案。这是针对python 2.7的(所以对于那些正在寻找python 3.x解决方案的人来说可能不起作用)。
建议的解决方案是更新 libgcc:4.8.5-2 --> 5.2.0-0
要更新 libgcc,请使用以下命令
conda update libgcc
以下建议可能有助于解决此问题:
- 确保驱动器配置 INI 文件
odbcinst -j
存在(检查odbcinst.ini
)。 - 确保 INI 文件中已配置驱动程序的文件路径(运行:
odbcinst -j
)存在,并且具有读取和可执行权限标志 (O_RDONLY|O_CLOEXEC
)。 -
如果您仍然收到文件未找到错误,尽管该文件存在,则问题可能与
libgcc
nehaljwani的GitHub评论中的版本不匹配有关。解决方案是通过运行conda update libgcc
命令来更新libgcc
。相关:适用于 SQL Server 的 ODBC Driver 13 在 AWS E2 ubuntu 实例上连接时无法在 pyodbc 上打开 lib。
-
对于 macOS,请参阅:通过自制软件安装 ODBC。
也许有点晚了,但我留下了这个对我有用的脚本。
我的问题和你的问题一样,我测试了所有选项,例如更改驱动程序位置、制作符号链接、修改/etc/*.ini 文件等......没有任何效果。
我的问题,运行python 3.6,pyodbc包在alpine的docker容器中是库libssl1.0.0
在这里,您将找到我的 pyodbc Debian 8 (alpine) docker 镜像的安装脚本,使用驱动程序 v13
DRIVER={ODBC Driver 13 for SQL Server}
我为数据库连接运行的命令是:
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)
我在安装 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
最后,我设置了语言环境:
apt-get -y install locales
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
完成这些步骤后,我的python模块能够找到并连接到数据库。
曾经遇到过同样的问题。1.尝试 conda 更新 libgcc(这是因为通过 pip 和 conda 安装的 pyodbc 会查找不同版本的文件..)。这可能已被修复.....link:https://github.com/ContinuumIO/anaconda-issues/issues/1639寻找内哈尔吉瓦尼的答案。
2.还要在/etc/odbcinst.ini 和/etc/odbc.ini 中正确检查 odbc 文件的版本号。名称应匹配,驱动程序路径也应匹配。
在装有macOS Mavericks的Mac mini M1上遇到了同样的问题。从支持 ARM 的Microsoft安装驱动程序 18 后,它仍然不起作用。
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
HOMEBREW_NO_ENV_FILTERING=1 ACCEPT_EULA=Y brew install msodbcsql18 mssql-tools18
但是,命令行上的 isql 能够连接到数据库。
isql -v -k "DRIVER={ODBC Driver 18 for SQL Server};SERVER=<MYSERVERNAME>;PORT=<MYPORT>;DATABASE=<MYDATABASE>;UID=<USERNAME>;PWD=<PASSWORD>"
最后,诀窍是卸载pyodbc并重新安装。
python -m pip uninstall pyodbc
python -m pip install pyodbc