pyodbc Netezza'ascii'编解码器无法编码位置0-2中的字符:序号不在范围内(128)
我是Python脚本编程新手,当我将shell脚本转换为Python以进行Netezza DB调用时,一个存储过程被调用传递参数。一切都按预期工作,并给出与Shell相同的结果。但在一种情况下,如果一个参数为null,它将从Netezza表(Varchar字段)读取该数据。在我测试该场景时并试图打印结果读取我有一个奇怪的错误,说''ascii'编解码器不能编码位置0-2字符:序号不在范围(128)“。我试图将值转换为字符串,但它是不工作。 附上脚本以供参考。 注:脚本可能不遵循Python的standards.Open任何改进建议代码的Netezza表 pyodbc Netezza'ascii'编解码器无法编码位置0-2中的字符:序号不在范围内(128)
try:
连接
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)
读取数据检查空参数列表暗淡
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ř
该错误消息是说,它不能解析字节为有效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)
此问题可能与UTF-8转换有关。您的结果提交了非Unicode字段,可能会导致此问题。尝试此解决方案。
参见:UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)
在Django的区域类似的问题。这会让你知道它起源于哪里。
Bimal在表定义我使用Varchar不nvarchar.For示例我将值'Custom1'存储到此字段没有其他特殊字符.Anyways我已经尝试所有解码选项但是,这并没有解决问题。这是与Netezza驱动程序编码技术我不确定。在shell脚本中,我们直接将此列值提取到一个没有任何问题的变量 –
感谢您的答复。我会尝试您给出的解决方案。我很困惑为什么varchar字段不可读python odbc.Attached代码以供参考。 –
我试过这个,它返回相同的错误'ascii'编解码器不能编码字符位置0-2:序号不在范围内(128) –
@ScottMcG分享你的想法,如果你遇到同样的问题 –