2015-10-06 94 views
3

我是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ř

回答

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

感謝您的答覆。我會嘗試您給出的解決方案。我很困惑爲什麼varchar字段不可讀python odbc.Attached代碼以供參考。 –

+0

我試過這個,它返回相同的錯誤'ascii'編解碼器不能編碼字符位置0-2:序號不在範圍內(128) –

+0

@ScottMcG分享你的想法,如果你遇到同樣的問題 –

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的區域類似的問題。這會讓你知道它起源於哪裏。

+0

Bimal在表定義我使用Varchar不nvarchar.For示例我將值'Custom1'存儲到此字段沒有其他特殊字符.Anyways我已經嘗試所有解碼選項但是,這並沒有解決問題。這是與Netezza驅動程序編碼技術我不確定。在shell腳本中,我們直接將此列值提取到一個沒有任何問題的變量 –

相關問題