2010-10-20 90 views
14

我有從sqlite3的數據庫中刪除記錄了一個問題:如何刪除表中的記錄?

conn = sqlite3.connect('databaza.db') 
c = conn.cursor() 
data3 = str(input('Please enter name: ')) 
mydata = c.execute('DELETE FROM Zoznam WHERE Name=?', (data3,)) 
conn.commit() 
c.close 

所有這些都是好的,但刪除不工作! 有人想法嗎?

+2

究竟什麼是行不通的?你使用的是哪個版本的Python? – SilentGhost 2010-10-20 12:10:11

+0

我正在使用python 3.1 – Risino 2010-10-20 12:18:53

+2

好,那麼* delete不起作用*其實是什麼意思? – SilentGhost 2010-10-20 12:19:41

回答

-4

謝謝大家誰試圖幫助。正確的代碼是:

conn = sqlite3.connect('databaza.db') 
c = conn.cursor() 
conn.text_factory = str  
data3 = str(input('Please enter name: ')) 
query = "DELETE FROM Zoznam WHERE Name = '%s';" % data3.strip() 
print(query) 
mydata = c.execute(query) 
+14

這很容易被SQL注入! – thirtythreeforty 2014-08-14 04:29:04

-2

檢查文件權限。

順便說一句,我更喜歡切分方法:

mydata = c.execute("DELETE FROM Zoznam WHERE Name='%s'" % data3) 
+11

請輸入名稱:...''; DROP TABLE Zoznam;' eumiro 2010-10-20 12:16:57

+0

在通過光標運行之前清除所有輸入。這與已經存在的東西沒有什麼不同。 – 2010-10-20 12:18:52

+0

也是,我問的名字不是嚴重從SQL – Risino 2010-10-20 12:19:55

-1

我勸你還是先爲查詢字符串,然後執行它。例如:

query = "delete from zoznam where name = '%s' " % data3 
c.execute(query) 
conn.commit() 
+7

中刪除,你們在哪裏得到這樣的想法? – SilentGhost 2010-10-20 12:28:57

+0

我不知道爲什麼,但我有很多問題試圖在sqlite中執行查詢,將實際的字符串查詢作爲execute方法的第一個參數,但是不知何故,我可以解決這個問題,從字符串中創建一個變量,然後通過它執行的方法。 – Kelmer 2010-10-21 09:56:54

+1

正如上面的答案所述,* always *使用sqlite命令的參數化版本,而不是手工創建查詢字符串。這將防止SQL注入(或至少大大降低風險)。 – shiin 2017-02-27 00:49:53

13

parameterized查詢正確的語法是:

mydata = c.execute("DELETE FROM Zoznam WHERE Name=?", (data3,)) 

確保參數使用逗號,使之成爲蟒蛇元組。

這將有助於防止傳入格式化字符串時可能出現的SQL注入。更多關於SQL注入的信息here

Related post here

+0

有一個字符串中最後一個字符的錯字。支架應該被移除。我無法編輯它,因爲編輯顯然需要6個字符。 – 2015-08-06 12:47:32

+0

糟糕!謝謝!固定。 – 2015-08-11 13:09:10

0

嘗試:

mydata = c.execute('DELETE FROM Zoznam WHERE Name = (?)', (data3)) 

沒有 '' 和 '?'之間'()'