【问题标题】:Can't connect to Database via turbodbc无法通过 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 时,一切正常(仅)。不知道错误发生的原因或方式,但此解决方法有效。

【问题讨论】:

    标签: python mysql odbc rodbc mysql-odbc-connector


    【解决方案1】:

    以下是一些建议:

    1. 错误消息似乎有些不完整。这可能表明 turbodbc 构建不正确(使用 unixodbc 标头进行测试)。
    2. 如果 turbodbc 是用 unixodbc 构建的,它将使用 unixodbc 的数据源配置。它不会使用为 iODBC 配置的配置。
    3. 您可以检查 unixodbc 是否可以使用 isql &lt;dsn&gt; &lt;user&gt; &lt;password&gt; -v 连接到您的数据库。
    4. 确保 unixodbc 的环境变量指向您的odbc.ini。这是通过export ODBCINI=/path/to/odbc.ini 完成的。
    5. 调整您的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 驱动程序。显然,我无法在时间线上做出任何承诺,但我认为这可能是其他用户也可能偶然发现的。
    猜你喜欢
    • 2015-01-08
    • 2010-10-02
    • 2019-02-03
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多