无法通过 turbodbc 连接到数据库

Posted

技术标签:

【中文标题】无法通过 turbodbc 连接到数据库【英文标题】:Can't connect to Database via turbodbc 【发布时间】:2017-02-22 11:38:26 【问题描述】:

TLDR:不要使用 unicode 驱动程序,使用 ansi!


我想通过 TurbODBC 而不是 Pandas/SQLAlchemy 连接到数据库。

我现在做了什么:

安装 unixodbc 安装 turbodbc 安装 iODBC 为 ODBC 安装 mysql 连接器 在 iODBC Admin 中配置端口和服务器 在 iODBC Admin 中使用 User 和 Pass 测试连接:工作正常!

现在我尝试执行以下操作:

from turbodbc import connect
connect(dsn="mydsn", user="myuser", password="mypass")

并收到以下错误消息:

---------------------------------------------------------------------------
DatabaseError                             Traceback (most recent call last)
<ipython-input-2-bbbc3a4c2880> in <module>()
----> 1 connect(dsn="mydsn", user="myuser", password="mypass")

/Users/myuser/anaconda2/lib/python2.7/site-packages/turbodbc/exceptions.pyc in wrapper(*args, **kwds)
     31             return f(*args, **kwds)
     32         except InternError as e:
---> 33             raise DatabaseError(str(e))
     34     return wrapper

DatabaseError: ODBC error
state: H

我现在不知道该怎么办,也没有发现与此错误有关的任何问题。

如果有人可以帮助我,我将非常高兴,在此先感谢! ;-)

更新

我在 R 中尝试使用 RODBC,效果很好。所以我确定这是 TurbODBC 的问题,但现在无法调试(我认为是 C++)代码....

更新 #2

我将设置文件.odbc.ini中的Mysql Connector for ODBC驱动改成了ansi驱动。我认为这必须是由于数据库的 unicode,其中包含 unicode 表......但是使用 ansi,当我在使用 ansi 驱动程序时在设置文件中手动将编码设置为 utf8 时,一切正常(仅)。不知道错误发生的原因或方式,但此解决方法有效。

【问题讨论】:

【参考方案1】:

以下是一些建议:

    错误消息似乎有些不完整。这可能表明 turbodbc 构建不正确(使用 unixodbc 标头进行测试)。 如果 turbodbc 是用 unixodbc 构建的,它将使用 unixodbc 的数据源配置。它不会使用为 iODBC 配置的配置。 您可以检查 unixodbc 是否可以使用 isql &lt;dsn&gt; &lt;user&gt; &lt;password&gt; -v 连接到您的数据库。 确保 unixodbc 的环境变量指向您的odbc.ini。这是通过export ODBCINI=/path/to/odbc.ini 完成的。 调整您的odbc.ini 直到isql 可以成功连接。然后再次尝试 turbodbc。

如果您仍然认为这是一个错误,请通过https://github.com/blue-yonder/turbodbc/issues 报告。

【讨论】:

2.:我将不得不更深入地研究这一点,以为他们都会在相同的 pathes/Env Vars 中寻找 .odbc.ini。 3.:工作正常,感谢您的提示! 现在(比较更新 #2)一切正常...我将 mysql 连接器驱动程序更改为 ansi 版本.. 好吧...一些新的东西(首先比较更新#2)...现在我尝试isql &lt;dsn&gt;...这适用于驱动程序、ansi 和 unicode...更改为 unicode破坏turbodbc,抛出原帖中描述的错误...... 有趣的地方。 Turbodbc 使用标准的SQLxxx() 函数。 Unicode 驱动程序应该公开SQLxxxW()(用于Unicode)和SQLxxxA()(用于ANSI)函数。所以这可能是 turbodbc 调用一组函数而驱动程序提供其他函数的问题。现在只是一个猜测:-)。您可以提出一个问题,即应该扩展 turbodbc 以支持 Unicode 驱动程序。显然,我无法在时间线上做出任何承诺,但我认为这可能是其他用户也可能偶然发现的。

以上是关于无法通过 turbodbc 连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法通过php连接到informix数据库

无法通过 excel 连接到分析服务

无法通过 python 中的 ssh 隧道连接到远程数据库

无法通过服务名使用 SQLPLUS 连接到 oracle 数据库

无法通过 PHP 连接到 Access 数据库

无法通过 ODBC 将 Access 连接到 SQLlite