pyodbc Netezza' ascii'编解码器不能对位置0-2中的字符进行编码:序数不在范围内(128)

时间:2015-10-06 11:58:12

标签: python encoding pyodbc netezza unixodbc

我是Python脚本的新手,当我将我的shell脚本转换为Python用于Netezza数据库调用时,其中使用传递的参数调用存储过程。所有内容都按预期工作,并且结果与Shell.But相同例如,如果一个参数为null,它将从Netezza表(Varchar字段)中读取该数据。虽然我正在测试该场景并尝试打印从中读取的结果,但我得到了一个奇怪的错误" ' ASCII'编解码器不能对位置0-2中的字符进行编码:序数不在范围内(128)"。我试图将值转换为字符串,但它不起作用。 附加脚本以供参考。 注意:该脚本可能不符合Python标准。打开任何改进代码的建议

连接

    try:
    conn_str   ="DRIVER={NetezzaSQL};SERVER="+results.host+";PORT=5480;DATABASE="+results.sugarDB+";UID="+results.username+";PWD="+results.password+""
    print conn_str
    conn_sugar = pyodbc.connect(conn_str,ansi=True)

    cur_sugar = conn_sugar.cursor()
    if (conn_sugar):
        print "Connection successful"

except Exception, e:

    print "Error while creating Netezza connection Error:",e

    sys.exit(-1)   

从Netezza表中读取数据

try:

检查空参数dim list

    if str(results.dimList)=="":
        print "dimlist is  null"

        var_query="select  LP.DIMENSIONS AS DIMENSIONS from PICASO..LKP_PX_RECOMMEND_METADATA LP where LP.client_id="+results.clientID+""
        print var_query
        for row in cur_sugar.execute(var_query):
            print "line no 62"
            print row.DIMENSIONS 
        conn_sugar.commit();            
    else:
        print "dimlist is not null",results.dimList
        v=results.dimList

    cur_sugar.execute("{exec SQLTOOLKIT..UDP_PRC_GET_MEDIAPLAN_RECOMMENDATION_3004("+results.clientID+","+results.configID+","+results.jobinstanceID+",'"+results.convBegin+"','"+results.convEnd+"','"+results.jaMeta+"','"+results.sugarDB+"','"+results.dimList+"','"+results.flag+"')}")
    conn_sugar.commit();
    conn_sugar.close();
except Exception, e:
    print "procedure call failed!!! Error :",e

错误

程序调用失败!!!错误:' ascii'编解码器不能对位置0-2中的字符进行编码:序数不在范围内(128)

由于 Anoop R

2 个答案:

答案 0 :(得分:0)

错误消息表明它无法将字节解析为有效的ascii字符串。字节解码有一个如何处理错误的选项。你可以'忽略'或'替换'。 'replace'将填充一个问题字符,原始字节无法解析为ascii。

value = b''
val_str = value.decode("ascii", 'ignore')

将序数视为ascii表查找的十进制数字(以字节为单位)。 http://www.asciitable.com/

value = bytes([97]) # a
val_str = value.decode("ascii", "ignore")
print(val_str)

答案 1 :(得分:0)

此问题可能与UTF-8转换有关。您的结果提交了非unicode,可能导致该问题。试试这个解决方案。

pyodbc remove unicode strings

参考:UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)

Django地区的类似问题。这将让您了解它的来源。