Python pandas-cdecimal.ConversionSyntax读取sql查询无效操作()

Python pandas-cdecimal.ConversionSyntax读取sql查询无效操作(),python,pandas,Python,Pandas,在处理数据库十进制数据类型时,Pandas read_sql_查询函数有问题。在使用varchar或integer类型时,我对下面相同的代码没有任何问题 版本信息: 下面是我尽可能减少代码以复制错误。我也尝试过通过sqlalchemy,但也遇到了同样的错误。netezza没有sqlalchemy引擎,因此它仍然需要依赖pyodbc import pyodbc import pandas as pd connection = pyodbc.connect("Driver={NetezzaSQL

在处理数据库十进制数据类型时,Pandas read_sql_查询函数有问题。在使用varchar或integer类型时,我对下面相同的代码没有任何问题

版本信息:

下面是我尽可能减少代码以复制错误。我也尝试过通过sqlalchemy,但也遇到了同样的错误。netezza没有sqlalchemy引擎,因此它仍然需要依赖pyodbc

import pyodbc 
import pandas as pd 
connection = pyodbc.connect("Driver={NetezzaSQL};servername=nzserver;database=MASTER;username=USER_GUY;password=****")

sql = "select cast(0.0 as decimal(6,2)) as testing "

data = pd.io.sql.read_sql_query(sql, connection, index_col=None, coerce_float=True)

#Also tried this, same error   
data = pd.io.sql.read_sql_query(sql, connection, index_col=None, coerce_float=False)


---------------------------------------------------------------------------
InvalidOperation                          Traceback (most recent call last)
<ipython-input-217-ba167303e6b2> in <module>()
      1 
----> 2 data = pd.io.sql.read_sql_query(sql, connection, index_col=None, coerce_float=True)
      3 # InvalidOperation: [<class 'cdecimal.ConversionSyntax'>]
      4 

看起来这是一个已知的pyodbc。那里有一个补丁,你可以试试。甚至还有来自netezza的评论。

好的,所以我让Pandas read_sql_查询处理netezza十进制数据类型。我是通过从pyodbc切换到pyodbc来实现的

我注意到unicode在结果中有一些奇怪的地方,所以我在PyODBC中向connection对象传递了一些额外的参数,现在看起来一切正常。我需要更改数据库输出/消息的unicode_results=False和ansi=true。。。但我认为我可以接受,因为我的数据应该符合ASCII,我甚至不确定新西兰对unicode的支持程度

从查询到data.frame的工作代码如下:


仅供参考,我还尝试了read_sql。。。同样的错误。呃,那是从2012年开始的。。。我会把补丁拔出来,看看能不能拼凑些东西。祝你好运!如果让它工作,请考虑将修改后的文件放在GITHUB上,并将链接放回到这里。
import pyodbc 
import pandas as pd 
connection = pyodbc.connect("Driver={NetezzaSQL};servername=nzserver;database=MASTER;username=USER_GUY;password=****")

sql = "select cast(0.0 as decimal(6,2)) as testing "

data = pd.io.sql.read_sql_query(sql, connection, index_col=None, coerce_float=True)

#Also tried this, same error   
data = pd.io.sql.read_sql_query(sql, connection, index_col=None, coerce_float=False)


---------------------------------------------------------------------------
InvalidOperation                          Traceback (most recent call last)
<ipython-input-217-ba167303e6b2> in <module>()
      1 
----> 2 data = pd.io.sql.read_sql_query(sql, connection, index_col=None, coerce_float=True)
      3 # InvalidOperation: [<class 'cdecimal.ConversionSyntax'>]
      4 
import pypyodbc
import pandas as pd
connection = \
pypyodbc.connect(
    "Driver=NetezzaSQL;SERVERNAME=nzserver;DATABASE=MASTER;PORT=5480;USERNAME=user_guy;PASSWORD=******",
    ansi=True,
    unicode_results=False)

sql = """select 
            cast(0.0 as decimal(6,2))      as decimal_test, 
            cast(0 as integer)             as int_test, 
            cast('aosenuth' as varchar(5)) as varchar_test ,
            current_timestamp              as timestamp_test """
data = pd.io.sql.read_sql_query(sql, connection, index_col=None, coerce_float=True)

print data.shape