pandas-cdecimal.ConversionSyntax invalidOperation on read_sql_query()[英] pandas - cdecimal.ConversionSyntax invalidOperation on read_sql_query()

本文是小编为大家收集整理的关于pandas-cdecimal.ConversionSyntax invalidOperation on read_sql_query()的处理方法,想解了pandas-cdecimal.ConversionSyntax invalidOperation on read_sql_query()的问题怎么解决?pandas-cdecimal.ConversionSyntax invalidOperation on read_sql_query()问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

在处理数据库 decimal 数据类型时,我遇到了 Pandas read_sql_query() 函数的问题.使用 varchar 或 integer 类型时,下面的相同代码没有问题.

版本信息:

CentOS 6.6
Python 2.7.10 :: Anaconda 2.3.0 (64-bit)
# packages in environment at /opt/anaconda:
pandas                    0.16.2               np19py27_0
cdecimal                  2.3                      py27_0
pyodbc                    3.0.10                   py27_0
sqlalchemy                1.0.8                    py27_0

下面是我尽可能减少的代码以复制错误.我也尝试过通过 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 

推荐答案

好的,所以我让 Pandas read_sql_query() 与 Netezza decimal 数据类型一起工作.我通过从 pyodbc 切换到 pypyodbc 来做到这一点(描述了 here).

我注意到结果中出现了一些奇怪的 unicode 问题,因此我向 pypyodbc 中的连接对象传递了一些额外的参数,现在似乎一切正常.我需要更改 unicode_results=False 和 ansi=true (用于 DB 输出/消息)...但我认为我可以接受,因为我的数据应该适合 ASCII,而且我什至不确定 NZ 对 unicode 的支持程度如何.

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

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

本文地址:https://www.itbaoku.cn/post/1728174.html