2016-09-20 5 views
0

웹 서버가있어서 SQL 쿼리에 사용자 데이터를 추가합니다. psycopg는 작동하지만 cx_Oracle은 작동하지 않습니다.cx_Oracle에서 web.input이 실패합니다.

... 
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) 

실행 명령문까지 작동합니다. 나는 오류 메시지가 : (128)

가 어떻게 내 쿼리에 데이터를 추가 할 수있는 범위 내에 있지 순서 : '아스키'코덱의 위치는 36 바이트 0xfc를 디코딩 할 수 있습니까?

답변

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 ... a.id = : 1"을 수행 할 수도 있습니다. [데이터 .ID]). cx_Oracle은 사전 또는 키워드 인수를 사용하는 명명 된 매개 변수와 목록을 사용하는 숫자 매개 변수를 모두 지원합니다. –