2017-11-29 20 views
0

나는 cx_oracle 연결을 가지고 있으며 CSV 파일의 성에서 ID를 수집하기 위해 일종의 '배치'를 실행하려고합니다. 아래 코드는 cx_Oracle.DatabaseError입니다 : ORA-01756 : 따옴표 붙은 문자열이 제대로 종료되지 않았습니다. 오류가 발생했습니다. 난 당신이 내 주석 코드가 이러한 방식으로 형식을 사용하고 잘 작동 보 겠지만이 작동 알고 그러나CSV에서 cx_oracle 읽기

이 라인

and spriden_change_ind is null'''.format(lname,fname) 

를 가리키고 있습니다. rows_to_dict_list는 기본적으로 열 이름을 출력에 추가하기 위해 언젠가 여기에서 찾은 멋진 함수입니다.

어떤 방향으로 좋을까요! 감사합니다

import csv, cx_Oracle 

def rows_to_dict_list(cursor): 
    columns = [i[0] for i in cursor.description] 
    new_list = [] 
    for row in cursor: 
     row_dict = dict() 
     for col in columns: 
      row_dict[col] = row[columns.index(col)] 
     new_list.append(row_dict) 
    return new_list 

connection = cx_Oracle.connect('USERNAME','PASSWORD','HOSTNAME:PORTNUMBER/SERVICEID') 
cur = connection.cursor() 
printHeader = True 
with open('nopnumber_names.csv')as csvfile: 
    reader = csv.DictReader(csvfile) 
    for row in reader: 
     lname = row['Last'] 
     fname = row['First'] 
     cur.execute('''select spriden_pidm as PIDM, 
        spriden_last_name as Last, 
        spriden_first_name as First, 
        spriden_mi as Middle, 
        spriden_ID as ID 
        from spriden 
        where upper(spriden_last_name) = '{0}' 
        and upper(spriden_first_name) = '{1}' 
        and spriden_change_ind is null'''.format(lname,fname) 
        ) 

     # THIS RECORD RUNS FINE 
     # cur.execute('''select spriden_pidm as PIDM, 
     #    spriden_ID as ID, 
     #    spriden_last_name as Last, 
     #    spriden_first_name as First 
     #    from spriden 
     #    where spriden_pidm = '{}' 
     #    and spriden_change_ind is null'''.format(99999) 
     #   ) 


data = rows_to_dict_list(cur) 
for row in data: 
    print row 
cur.close() 
connection.close() 

답변

1

내 추측은 CSV 파일의 이름 또는 어딘가에 성이있는 ' 문자를 가지고 있다는 것입니다.

정말 문자열을 연결하거나 문자열 서식을 사용하여 SQL을 작성하면 안됩니다. 그렇게하면 SQL injection의 위험에 처해 있습니다. 누군가 CSV 파일에 성이 X' OR 1=1 -- 인 레코드를 넣으면 어떻게됩니까?

대신 바인드 매개 변수를 사용하여 변수 값을 데이터베이스에 보냅니다. .. 당신이 게시물을하지 않았다면

 cur.execute('''select spriden_pidm as PIDM, 
        spriden_last_name as Last, 
        spriden_first_name as First, 
        spriden_mi as Middle, 
        spriden_ID as ID 
        from spriden 
        where upper(spriden_last_name) = :lname 
        and upper(spriden_first_name) = :fname 
        and spriden_change_ind is null''', 
        {"lname": lname, "fname": fname} 
        ) 
+0

은 그냥 '는 이름에 그래서 사람들은 확실히 범인있는이 이명 (FNAME에서 하나 LNAME 하나를 발견 지금은 궁금 다음을 시도하십시오 왜 실행되었지만 프로세스가 성공적으로 완료되었지만 출력이 없습니다! –