2015-09-29 25 views
3

我在使用數據庫decimal數據類型時遇到了Pandas read_sql_query()函數的問題。使用varcharinteger類型時,我對以下相同的代碼沒有問題。pandas - cdecimal.ConversionSyntax readOptional on read_sql_query()

版本信息:

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 
+0

僅供參考,我也試圖與'read_sql()'...同樣的錯誤。 – joefromct

回答

0

好的,所以我讓Pandas read_sql_query()與Netezza decimal數據類型一起工作。我通過從pyodbc切換到pypyodbc(描述爲here)來做到這一點。

我注意到結果中有unicode的一些奇怪的東西,所以我在pypyodbc中向連接對象傳遞了一些額外的參數,現在事情似乎正常工作。我需要更改unicode_results=Falseansi=true(對於數據庫輸出/消息)......但我認爲我可以,因爲我的數據應該符合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 
2

看起來這是一個已知的issue有pyodbc。你可能會嘗試一些補丁。 netezza甚至有評論。

+0

呃,從2012年開始......我會拉上補丁,看看能不能湊齊一些東西。 – joefromct

+0

祝你好運!如果你得到它的工作,考慮把你的修改後的文件放在Github上,並把鏈接放到這裏。 –