2012-12-14 63 views
10

我嘗試在Python中執行此sqlite3查詢。我減少了代碼到最低限度,sqlite.connect等工程。Python sqlite3字符串變量在執行

column = 'Pron_1_Pers_Sg' 
goal = 'gender' 
constrain = 'Mann' 


with con: 
    cur = con.cursor() 

    cur.execute("SELECT ? FROM Data where ?=?", (column, goal, constrain)) 
    con.commit() 

    rows = cur.fetchall() 

    for element in rows: 
     values.append(element) 

這將返回一個空列表。 如果我對字符串進行硬編碼,它將起作用並返回值。

回答

25

參數標記只能用於表達式,即值。 您不能將它們用於表名和列名等標識符。

使用此:

cur.execute("SELECT "+column+" FROM Data where "+goal+"=?", (constrain,)) 

或本:

cur.execute("SELECT %s FROM Data where %s=?" % (column, goal), (constrain,)) 

(和之前你已經實際完成存取數據不提交)

+0

我可以發誓,我在寫這個問題之前試過!無論如何,它現在起作用。謝謝! – Steffen

+1

這會容易受到sql注入的影響嗎? –

+1

@DrewV是的,如果你讓'column'或'goal'被攻擊者控制。 –

-1

今天我有一個相當類似的問題。我不知道,如果這可以解決你的問題:

cur.execute("SELECT ? FROM Data where ?=?", (column, goal, constrain,)) 

重要的是最後的

試試看吧,這是我的代碼問題 - 所以也許它可以幫助你。對不起,我無法真正解釋爲什麼,因爲我只是在學習自己,並在幾周內進入python/sqlite。

+2

最後只需要一個元素的'',''來區分它們和一個簡單的表達式。 –

+1

謝謝,但這並沒有幫助。但我可以解釋一些事情:就是因爲提供的值必須是一個元組。 – Steffen

+0

非常感謝你們兩位。這真的幫助我瞭解,我試圖整天圍繞我的腦袋。 – sdoering

0

試試這個:c.execute("SELECT {idf} FROM Data WHERE {goal}".\ format(idf=column, goal=constrain))