【问题标题】:pandas - cdecimal.ConversionSyntax invalidOperation on read_sql_query()pandas - cdecimal.ConversionSyntax invalidOperation on read_sql_query()
【发布时间】:2015-12-27 03:02:42
【问题描述】:

在使用数据库 decimal 数据类型时,我遇到了 Pandas read_sql_query() 函数的问题。在使用 varcharinteger 类型时,我对下面的相同代码没有任何问题。

版本信息:

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 

【问题讨论】:

  • 仅供参考,我也试过read_sql()...同样的错误。

标签: python pandas


【解决方案1】:

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

【讨论】:

  • 呃,那是 2012 年的……我会拉下补丁,看看能不能拼凑出一些东西。
  • 祝你好运!如果你得到它的工作,考虑把你修改过的文件放在 Github 上,然后在这里放一个链接。
【解决方案2】:

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

我注意到结果中出现了一些奇怪的 unicode 问题,因此我向pypyodbc 中的连接对象传递了一些额外的参数,现在一切似乎都正常工作了。我需要更改unicode_results=Falseansi=true(用于数据库输出/消息)...但我认为我可以接受,因为我的数据应该适合 ASCII,而且我什至不确定新西兰对 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2015-08-19
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多