Gas*_*ove 8 python odbc pyodbc netezza
所以.这个问题与这里讨论的问题几乎完全相同- 但是该帖子中讨论的修复(例如它)并不能解决问题.
我正在尝试使用Python 2.7.5和pyodbc 3.0.7从Ubuntu 12.04 64位机器连接到IBM Netezza数据库.我正在使用unixODBC来处理指定DSN.这个DSN在isqlCLI中工作得非常好- 所以我知道它配置正确,unixODBC正在顺利进行.
代码目前很简单,并且很容易在REPL中重现:
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''
Run Code Online (Sandbox Code Playgroud)
所以我得到一个连接,查询正确返回,然后当我尝试获取一行... asplode.
有人曾设法做到这一点?
Gas*_*ove 11
原来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
Run Code Online (Sandbox Code Playgroud)
如果我找到一个较低级别的答案,我会在这里发帖.
| 归档时间: |
|
| 查看次数: |
10007 次 |
| 最近记录: |