2010-10-20 24 views
14

J'ai un problème avec la suppression d'un enregistrement de base de données sqlite3:Comment supprimer un enregistrement de la table?

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 

Tout est bien, mais supprimer ne fonctionne pas! Vous avez des idées?

+2

Qu'est-ce qui ne fonctionne pas exactement? quelle version de python utilisez-vous? – SilentGhost

+0

J'utilise python 3.1 – Risino

+2

Génial, alors qu'est-ce que * supprimer ne fonctionne pas? – SilentGhost

Répondre

-4

Merci à tous ceux qui ont essayé de vous aider. Le code est bon:

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

Ceci est vulnérable à l'injection SQL! – thirtythreeforty

-2

Vérifiez les autorisations de fichier.

Un côté, je préfère la méthode sous forme de jeton:

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

Veuillez entrer le nom: ... ''; DROP TABLE Zoznam;' eumiro

+0

Vous nettoyez toutes les entrées avant de les passer à travers le curseur. Ce n'est pas différent de ce qui existe déjà. –

+0

aussi, nom dont je demande ne pas effacer de SQL – Risino

-1

Je vous conseille de d'abord faire une chaîne pour la requête, puis l'exécuter. ex:

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

sérieusement, où obtenez-vous de telles idées? – SilentGhost

+0

Je ne sais pas pourquoi, mais j'ai eu beaucoup de problèmes à essayer d'exécuter des requêtes dans sqlite en incluant la requête string réelle comme premier argument de la méthode execute, mais je pourrais résoudre ce problème en créant une variable hors de la chaîne à la méthode d'exécution. – Kelmer

+1

Comme indiqué dans la réponse ci-dessus, * toujours * utilise la version paramétrée des commandes sqlite au lieu de créer des chaînes de requête à la main. Cela permettra d'éviter (ou du moins réduire considérablement le risque) pour les injections SQL. – shiin

13

La syntaxe correcte pour une requête parameterized est:

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

Assurez-vous que le paramètre utilise la virgule, pour en faire un tuple python.

Cela aidera à empêcher l'injection SQL qui est possible lors du passage dans une chaîne formatée. Plus d'informations sur l'injection SQL here

Affecté here.

+0

il y a une faute de frappe avec le dernier caractère de la chaîne. Le support doit être retiré. Je ne peux pas le modifier car les modifications doivent être de 6 caractères apparemment. –

+0

Oups! Merci! Fixé. –

0

Essayez avec:

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

Sans '' et '?' entre '()'