2010-10-20 18 views
14

Ho un problema con l'eliminazione di un record dal database sqlite3:Come eliminare un record dalla tabella?

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 

Tutto è buono, ma eliminare non funziona! Qualcuno ha qualche idea?

+2

cosa esattamente non funziona? quale versione di Python stai usando? – SilentGhost

+0

Sto usando python 3.1 – Risino

+2

Grande, quindi cosa significa * cancella non funziona * in realtà significa? – SilentGhost

risposta

-4

Grazie a tutti coloro che hanno cercato di aiutare. Il codice giusto è:

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

Questo è vulnerabile all'iniezione SQL! – thirtythreeforty

-2

Verificare le autorizzazioni del file.

Una parentesi, io preferisco il metodo token:

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

Inserire il nome: ... ''; DROP TABLE Zoznam;' eumiro

+0

Si pulisce tutto l'input prima di eseguirlo attraverso il cursore. Non è diverso da quello che c'è già. –

+0

anche, il nome di chi chiedo non cancella seriamente da SQL – Risino

-1

vi consiglio di fare prima una stringa per la query e quindi eseguirlo. es:

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

, dove prendi queste idee? – SilentGhost

+0

Non so perché, ma ho avuto molti problemi nel tentativo di eseguire query in sqlite che racchiudesse la query stringa effettiva come primo argomento del metodo execute, ma in qualche modo potrei risolvere questo problema creando una variabile fuori dalla stringa e poi passare per il metodo di esecuzione. – Kelmer

+1

Come indicato nella risposta di cui sopra, * sempre * usa la versione parametrizzata dei comandi sqlite invece di creare stringhe di query a mano. Ciò impedirà (o almeno ridurrà notevolmente il rischio) per le iniezioni SQL. – shiin

13

La sintassi corretta per una query parameterized è:

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

Assicurarsi che il parametro utilizza la virgola, per renderlo una tupla pitone.

Questo aiuterà a prevenire l'SQL Injection, che è possibile quando si passa in una stringa formattata. Altro su SQL Injection here

Post correlati here.

+0

c'è un errore di battitura con l'ultimo carattere nella stringa. La parentesi dovrebbe essere rimossa. Non posso modificarlo perché le modifiche devono essere 6 caratteri apparentemente. –

+0

Oops! Grazie! Fisso. –

0

Prova con:

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

senza la funzione '' e '?' tra '()'

Problemi correlati