我正在尝试使用Python 3.4.3在Ubuntu 14.04上配置ODBC.我能够成功建立连接,但是执行时出现此错误:
>>> cursor.execute("SELECT * FROM xxx.yyy.zzz LIMIT 100;")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pyodbc.ProgrammingError: ('42000', '[42000] ERROR: \'S\'\nerror ^ found "S" (at char 1) expecting a keyword (27) (SQLExecDirectW)')
执行查询的相同代码在Python 2.7上运行良好.我还可以使用strace isql从UNIX外壳建立连接,这使我认为ODBC连接工作正常.是吗?
网上没有太多有关此的信息.以下是根据我发现的一些博客所做的一些事情.我的理解正确吗?
>如PyODBC ticket中所述:
In my case the ODBC driver (NetezzaSQL) was set to use
UTF8. I first though the issue was either a UC2 or UC4 build of Python. Both made no difference. Switching the driver to UTF16
(UnicodeTranslationOption=utf16) fixed the issue for me.
我在所有obdc * .ini文件中都设置了UnicodeTranslationOption = utf16.由于我的代码在Python 2.7上运行,是否表示此参数设置正确?
>在document to configure PyODBC中提到我应该使用UCS2版本构建Python.但是在我的机器上,Python2.7和Python3.4都说它们具有UCS4版本,并且由于代码在Python 2.x上运行,因此这不是UCS4的问题.
我使用以下命令检查了UCF版本:
user@host:~$python -c "import sys;print(sys.maxunicode<66000 and'UCS2'or'UCS4')"
UCS4
user@host:~$python3 -c "import sys;print(sys.maxunicode<66000 and'UCS2'or'UCS4')"
UCS4
解决方法:
在/etc/odbcinst.ini文件中,将UnicodeTranslationOption设置为utf16:
UnicodeTranslationOption = utf16
然后将/etc/odbcinst.ini复制到/home/\u0026lt;user\u0026gt;/.odbcinst.ini
另一个技巧是将/etc/odbc.ini复制到/home/\u0026lt;user\u0026gt;/.odbc.ini,这样就不必导出以下变量:
> LD_LIBRARY_PATH
> ODBC_INI
> NZ_ODBC_INI_PATH