执行查询时 PyODBC Python 3 错误 (Ubuntu 14.04)

Moi*_*dri 4 python pyodbc netezza python-3.x ubuntu-14.04

我正在尝试使用 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)')
Run Code Online (Sandbox Code Playgroud)

执行查询的相同代码在 Python 2.7 上运行良好。我还可以使用 UNIX shell 建立连接strace isql,这让我认为我的 ODBC 连接工作正常。是吗?


网上没有太多关于此的信息。以下是我根据我发现的一些博客所做的一些事情。我的理解正确吗?

  1. 正如PyODBC 票证中提到的:

    在我的例子中,ODBC 驱动程序 (NetezzaSQL) 设置为使用 UTF8。我首先认为问题是 Python 的 UC2 或 UC4 版本。两者没有区别。将驱动程序切换为 UTF16 (UnicodeTranslationOption=utf16) 解决了我的问题。

    我已经UnicodeTranslationOption=utf16设置了所有obdc*.ini文件。由于我的代码在Python 2.7上运行,这是否意味着该参数设置正确?

  2. 配置 PyODBC 的文档中提到我应该使用UCS2版本构建 Python。但在我的机器上,两者Python2.7Python3.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
    
    Run Code Online (Sandbox Code Playgroud)

Kun*_*nal 6

在您的/etc/odbcinst.ini文件中,设置UnicodeTranslationOptionutf16

UnicodeTranslationOption = utf16
Run Code Online (Sandbox Code Playgroud)

然后复制/etc/odbcinst.ini/home/<user>/.odbcinst.ini

另一个技巧是将复制到/etc/odbc.ini/home/<user>/.odbc.ini这样您就不需要导出以下变量:

  • LD_LIBRARY_PATH
  • ODBC_INI
  • NZ_ODBC_INI_PATH