web.input在cx_Oracle中失败

问题描述:

我有一个网络服务器,我会将用户数据添加到我的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)

我怎样才能将数据添加到我的查询?

我知道什么是错的。我不应该使用%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支持使用字典或关键字参数以及使用列表的数字参数的两个命名参数。 –