无法通过 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 <dsn> <user> <password> -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 <dsn>
...这适用于驱动程序、ansi 和 unicode...更改为 unicode破坏turbodbc,抛出原帖中描述的错误......
有趣的地方。 Turbodbc 使用标准的SQLxxx()
函数。 Unicode 驱动程序应该公开SQLxxxW()
(用于Unicode)和SQLxxxA()
(用于ANSI)函数。所以这可能是 turbodbc 调用一组函数而驱动程序提供其他函数的问题。现在只是一个猜测:-)。您可以提出一个问题,即应该扩展 turbodbc 以支持 Unicode 驱动程序。显然,我无法在时间线上做出任何承诺,但我认为这可能是其他用户也可能偶然发现的。以上是关于无法通过 turbodbc 连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章