【问题标题】:PyODBC Python 3 error while executing query (Ubuntu 14.04)执行查询时出现 PyODBC Python 3 错误(Ubuntu 14.04)
【发布时间】:2017-02-11 15:01:50
【问题描述】:

我正在尝试使用 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 shell 建立连接,这让我认为我的 ODBC 连接工作正常。 是吗?


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

  1. 正如PyODBC ticket中提到的:

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

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

  2. document to configure 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
    

【问题讨论】:

  • 最后,我不得不创建在 Python2.7 上运行的新应用程序

标签: python python-3.x ubuntu-14.04 pyodbc netezza


【解决方案1】:

在您的/etc/odbcinst.ini 文件中,将UnicodeTranslationOption 设置为utf16

UnicodeTranslationOption = utf16

然后将/etc/odbcinst.ini复制到/home/&lt;user&gt;/.odbcinst.ini

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

  • LD_LIBRARY_PATH
  • ODBC_INI
  • NZ_ODBC_INI_PATH

【讨论】:

    【解决方案2】:

    您必须强制 pyodbc 连接使用 UTF-8。 (请注意,保留 odbcinst.ini 文件的“UnicodeTranslationOption=utf8”设置)

    创建连接后,请在使用前执行以下操作:

    connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
    connection.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
    connection.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-8')
    connection.setencoding(encoding='utf-8')
    

    我遇到了同样的问题,这是唯一对我有用的方法。更多信息可以在 github 上的 pyodbc 文档中找到:https://github.com/mkleehammer/pyodbc/wiki/Connecting-to-Netezza

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多