2015-11-03 41 views
0

問題我有一個簡單的應用程序來查詢我的一些oracle表我希望能夠抓住我的文本框的工作價值,但是,我不斷得到這個錯誤任何幫助將不勝感激!如何在python中的sql select語句中使用多個變量?

test.py

def grabEnts(): 
    global date 
    connection = cx_Oracle.connect('xxxxxxxx/[email protected]:xxxx/xxx') 
    cursor = connection.cursor() 
    startdate = e1.get() 
    enddate = e2.get() 
    #fs = datetime.date(startdate) 
    #fe = datetime.date(endate) 
    //this works but, I would like to use both startdate and endate 
    #cursor.execute("SELECT EMP_ID FROM TO_ENTRIES WHERE LEAVE_START >= '%s'" % startdate) 
    //Like this but I can't get it to work I keep getting this error 
    File "test.py", line 62, in grabEnts 
    cursor.execute('SELECT EMP_FIRST_NAME FROM TO_ENTRIES WHERE LEAVE_START >=%s AND LEAVE_END <=%s', startdate, enddate) 
    TypeError: function takes at most 2 arguments (3 given) 

    cursor.execute('SELECT EMP_FIRST_NAME FROM TO_ENTRIES WHERE LEAVE_START >=%s AND LEAVE_END <=%s', startdate, enddate) 
    for row in cursor: 
     outputent.writerow(row) 
    cursor.close() 
    connection.close() 
+0

多少參數,你傳遞給cursor.execute()?它有多少預期?什麼是錯誤的? ;-)順便說一下,我不能強調這一點,通常將用戶輸入直接插入到SQL中會打開一個所謂的SQL注入攻擊,因此應該像鼠疫一樣避免。你應該改用參數化查詢。看看這裏:http://bobby-tables.com/ –

回答

1

當格式字符串提供多個值,你需要用這些括號:

"My name is %s. Your name is %s." % ("Sam", "Joe") 
+0

好吧,那麼我會怎麼做呢('選擇*從TO_ENTRIES WHERE LEAVE_START> =%s和LEAVE_END <=%s'%(startdate,enddate)),因爲這個也不會工作...我得到這個錯誤NameError:全球名'stardate'沒有被定義 @TomKarzes – Snowman288

+0

我也試過這種方式,並得到這個錯誤cursor.execute('選擇EMP_FIRST_NAME從TO_ENTRIES WHERE LEAVE_START> =% s AND LEAVE_END <=%s'%(「stardate」,「enddate」)) DatabaseError:ORA-00904:「ENDDATE」:無效標識符 @TomKarzes – Snowman288

+0

您是否鍵入「startdate」或「stardate」?確保你拼寫正確。 –

0

使用字符串格式化來生成SQL一般是一個壞主意。如果用戶輸入類似; DROP TABLE blah的東西,這將在您的代碼中執行。這是SQL注入的典型例子...

要避免,使用參數查詢,像這樣:

cursor.execute('SELECT EMP_FIRST_NAME FROM TO_ENTRIES WHERE LEAVE_START between :start AND :end', {'start': 1, 'end': 10}) 
相關問題