2016-09-20 26 views
0

我有一個網絡服務器,我會將用戶數據添加到我的SQL查詢中。它適用於psycopg,但不適用於cx_Oracle。web.input在cx_Oracle中失敗

... 
class grid: 
    def GET(self): 
     web.header('Access-Control-Allow-Origin', '*') 
     web.header('Access-Control-Allow-Credentials', 'true') 
     web.header('Content-Type', 'application/json') 

     data = web.input(ID='') 
     ido = int(data.ID) 
     a = [ido] 

     cur = connection.cursor() 
     cur.arraysize = 10000 

     query = "SELECT a.id AS building_nr, c.geometry.sdo_ordinates AS geometry, d.Classname AS polygon_typ FROM building a, THEMATIC_SURFACE b, SURFACE_GEOMETRY c, OBJECTCLASS d WHERE a.id = b.BUILDING_ID AND b.LOD2_MULTI_SURFACE_ID = c.ROOT_ID AND c.GEOMETRY IS NOT NULL AND b.OBJECTCLASS_ID = d.ID AND a.grid_id_500 = %s;" 

     cur.execute(query, a) 

它一直運行到execute語句。我得到的錯誤消息:在36位 「ASCII」編解碼器不能解碼字節0xFC有:有序不在範圍內(128)

我怎樣才能將數據添加到我的查詢?

回答

1

我知道什麼是錯的。我不應該使用%s作爲數據。顯然,cx_Oracle默認爲「命名」參數樣式。

data = web.input(ID='') 
query = "SELECT ... FROM... WHERE a.id =:grid_id " 
cursor.execute(query, {'grid_id':data.ID}) 
+0

是的,使用綁定變量!它們不僅可以提高性能,還可以提高安全性(消除SQL注入)。請注意,您還可以執行以下操作:cursor.execute(query,grid_id = data.ID)或者也可以執行以下操作cursor.execute(「select ... from ... where a.id =:1」, [data.ID])。 cx_Oracle支持使用字典或關鍵字參數以及使用列表的數字參數的兩個命名參數。 –