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
如果找到较低级别的答案,我将在此处发布。
我刚刚遇到了同样的问题,并找到了不同的解决方案。我设法通过:
解决了问题确保以下属性是ODBC INI文件中我的驱动程序选项的一部分:
- unicodetranslationoption = utf16
- trameTranslationOption = ash all
添加以下环境变量:
- 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数据类型中的字符