2010-10-20 16 views
14

Ich habe ein Problem mit einen Datensatz aus sqlite3 Datenbank zu löschen:Wie lösche ich den Datensatz aus der Tabelle?

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 

Alles ist gut, aber löschen funktioniert nicht! Haben Sie jemanden eine Idee?

+2

was genau funktioniert nicht? Welche Version von Python verwendest du? – SilentGhost

+0

Ich benutze Python 3.1 – Risino

+2

Großartig, so was funktioniert * löschen funktioniert nicht * eigentlich gemein? – SilentGhost

Antwort

-4

Vielen Dank an alle, die versucht haben zu helfen. Der richtige Code ist:

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

Dies ist anfällig für SQL-Injektion! – thirtythreeforty

-2

Überprüfen Sie die Dateiberechtigungen.

Nebenbei bemerkt, ziehe ich die Zeichen übersetzten Methode:

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

Bitte geben Sie den Namen ein: ... ''; DROP TABLE Zoznam;' eumiro

+0

Sie reinigen alle Eingaben, bevor Sie sie durch den Cursor führen. Es ist nicht anders als das, was schon da ist. –

+0

auch, Name, dessen ich nicht aus SQL – Risino

-1

ich Ihnen raten, zuerst eine Zeichenfolge für die Abfrage zu machen, und es dann auszuführen. ex:

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

ernsthaft fragen, wo bekommen Sie solche Ideen? – SilentGhost

+0

Ich weiß nicht warum, aber ich hatte viele Probleme beim Ausführen von Abfragen in SQLite, wobei die eigentliche String-Abfrage als erstes Argument der execute-Methode eingeschlossen ist, aber irgendwie könnte ich dieses Problem lösen, indem ich eine Variable aus der Zeichenfolge erstelle und dann passiere es zur Ausführungsmethode. – Kelmer

+1

Wie in der obigen Antwort erwähnt, * verwenden * Sie immer die parametrisierte Version der SQLite-Befehle, anstatt Abfragezeichenfolgen manuell zu erstellen. Dies wird das Risiko für SQL-Injektionen verhindern (oder zumindest stark reduzieren). – shiin

13

Die korrekte Syntax für eine parameterized Abfrage ist:

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

Sicherstellen, dass der Parameter das Komma verwendet, es ist ein Python-Tupel zu machen.

Dies wird dazu beitragen, SQL Injection zu verhindern, die beim Übergeben einer formatierten Zeichenfolge möglich ist. Mehr über SQL Injection here

Verwandte Post here.

+0

gibt es einen Tippfehler mit dem letzten Zeichen in der Zeichenfolge. Die Halterung sollte entfernt werden. Ich kann es nicht bearbeiten, da die Änderungen offensichtlich 6 Zeichen lang sein müssen. –

+0

Hoppla! Vielen Dank! Fest. –

0

Versuchen mit:

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

Ohne die '' und das '?' zwischen '()'

Verwandte Themen