2017-11-29 13 views
0

私はcx_oracle接続を持っていますが、CSVファイルから姓のIDを収集しようとしている「バッチ」を実行しようとしています。以下は私のコードがあり、cx_Oracle.DatabaseErrorを取得しています。ORA-01756:引用符付きの文字列が正しく終了していないというエラーです。私はあなたが私のコメントのコードは、このようにフォーマットを使用し、それだけで正常に動作表示されますと、これは働いている知っているしかしcx_oracle from CSV

それはライン

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の内の1つの、その名前に 'を持ってLNAMEの1(2人を発見したので、それらは間違いなく犯人いる今、私は疑問に思って。なぜそれが走ったのですが、プロセスが正常に完了したにもかかわらず出力がありませんでした! –