Python PyoDBC连接到IBM Netezza错误



so。这个问题几乎与这里讨论的问题完全相同 - 但是该帖子中讨论的修复程序(例如)并没有为我解决问题。

我正在尝试使用Python 2.7.5和PYODBC 3.0.7连接从Ubuntu 12.04 64位机器连接到IBM Netezza数据库。我正在使用UnixODBC来处理指定DSN。该DSN从isql CLI中运行得很好 - 因此,我知道它的配置正确,并且UnixoDBC正在滴答作用。

该代码当前很简单,并且易于复制:

In [1]: import pyodbc
In [2]: conn = pyodbc.connect(dsn='NZSQL')
In [3]: curs = conn.cursor()
In [4]: curs.execute("SELECT * FROM DB..FOO ORDER BY created_on DESC LIMIT 10")
Out[4]: <pyodbc.Cursor at 0x1a70ab0>
In [5]: curs.fetchall()
---------------------------------------------------------------------------
InvalidOperation                          Traceback (most recent call last)
<ipython-input-5-ad813e4432e9> in <module>()
----> 1 curs.fetchall()
/usr/lib/python2.7/decimal.pyc in __new__(cls, value, context)
    546                     context = getcontext()
    547                 return context._raise_error(ConversionSyntax,
--> 548                                 "Invalid literal for Decimal: %r" % value)
    549
    550             if m.group('sign') == "-":
/usr/lib/python2.7/decimal.pyc in _raise_error(self, condition, explanation, *args)
   3864         # Errors should only be risked on copies of the context
   3865         # self._ignored_flags = []
-> 3866         raise error(explanation)
   3867
   3868     def _ignore_all_flags(self):
InvalidOperation: Invalid literal for Decimal: u''

因此,我获得了一个连接,查询正确返回,然后当我尝试获得一行...时。

有人曾经设法这样做吗?

结果pyodbc无法优雅地转换Netezza的所有类型。我正在使用的桌子有两个问题:

  • NUMERIC(7,2)类型的一列
  • 类型NVARCHAR(255)的一列

NUMERIC列在NULL上导致小数转换误差。NVARCHAR列返回一个UTF-16-LE编码字符串,这是屁股的痛苦。

我还没有找到一个好的驱动程序或与之打交道的解决方案。这可以通过在SQL语句中铸造类型来入侵:

SELECT
     foo::FLOAT AS was_numeric
     , bar::VARCHAR(255) AS was_nvarchar

如果找到较低级别的答案,我将在此处发布。

我刚刚遇到了同样的问题,并找到了不同的解决方案。我设法通过:

解决了问题
  1. 确保以下属性是ODBC INI文件中我的驱动程序选项的一部分:

    • unicodetranslationoption = utf16
    • trameTranslationOption = ash all
  2. 添加以下环境变量:

    • ld_library_path = $ ld_library_path:[netezza_lib_files_path]
    • odbcini = [odbc_ini_full_path]
    • nz_odbc_ini_path = [odbc_ini_folder_path]

    在我的情况下,值为:

    • ld_library_path = $ ld_library_path:/usr/local/nz/lib
    • odbc_ini =/etc/odbc.ini
    • nz_odbc_ini_path =/etc

我正在使用CentOS 6,还安装了" UnixoDBC"one_answers" UnixoDBC-Devel"软件包。

希望它对某人有帮助。

我不确定您的错误是什么,但是下面的代码允许我通过ODBC连接到Netezza:

# Connect via pyodbc to listed data sources on machine
import pyodbc
print pyodbc.dataSources()
print "Connecting via ODBC"
# get a connection, if a connect cannot be made an exception will be raised here
conn = pyodbc.connect("DRIVER={NetezzaSQL};SERVER=<myserver>;PORT=<myport>;DATABASE=<mydbschema>;UID=<user>;PWD=<password>;")
print "Connected!n"
# you can then use conn cursor to perform queries

netezza linux客户端软件包包括 /usr/local/nz/lib/ODBC_README,其中列出了这两个属性的所有值:

Unicodetranslation:    指定Unicode的翻译选项。    可能的价值字符串是:        UTF8:UNICODE数据在UTF-8编码中        UTF16:Unicode数据在UTF-16编码中        UTF32:Unicode数据在UTF-32编码中    请勿在上面列出的值字符串中添加' - ',例如" UTF-8"不是    有效的字符串值。这些价值字符串是不敏感的。    在Windows上,此选项不可用,因为Windows DM总是通过    UTF16中的Unicode数据。trameTranslationOption(Windows上的ASCII字符集优化):    指定字符编码的翻译选项。    可能的价值字符串是:        全部:支持所有字符编码        拉丁9:仅支持拉丁9个字符编码    请勿在上面列出的值字符串中添加' - ',例如"拉丁-9"    不是有效的字符串值。这些价值字符串是情况    不敏感。    NPS使用latin9字符编码用于char和varchar    数据类型。在许多Windows系统上编码的字符    是相似的,但与此不同。对于ASCII子集    (字母A-Z,A-Z,数字0-9和标点符号)是    完全相同的。如果您的字符数据或varchar datatypes中    仅在此ASCII子集中,如果此框是    检查。如果您的数据具有特殊字符,例如欧元    签名(€),然后将盒子保持不合格以准确转换    编码。NCHAR或NVARCHAR数据类型中的字符    
将始终进行适当的转换。

相关内容

  • 没有找到相关文章

最新更新