2012-08-22 16 views
8

qui sto cercando di rimuovere tutti gli utenti che containt un "in loro e-mail/nome utente.python mysql istruzione DELETE non funziona

def removeQuote(self, tbl,record): 
      """ Updates the record """ 
      statmt="select id from %s WHERE `email` LIKE '%%\"%%'" % (tbl) 
      self.cursor.execute(statmt) 
      rows=list(self.cursor.fetchall()) 
      for idx, val in enumerate(rows): 
        id= val[0] 
        delstatmt = "DELETE FROM `maillist_subscription` WHERE id = '%s'" % id 
        print delstatmt 
        self.cursor.execute(delstatmt) 

L'output di questa mostra, come se l'azione conclusa con successo, ma i resti dei record . nel database Output mostra anche una corretta dichiarazione mysql:

DELETE FROM `maillist_subscription` WHERE id = '8288754' 

Grazie per tutto il vostro aiuto

risposta

15

È necessario per confermare la modifica, con t he metodo commit() sull'oggetto di connessione. La maggior parte delle interfacce DBAPI utilizza transazioni implicite.

Inoltre, non utilizzare la formattazione di stringhe per la generazione di query SQL! Vi apriremo alle iniezioni SQL:

UNSAFE !!

# What happens if id = "1'; DROP DATABASE somedb" ? 
delstatmt = "DELETE FROM `maillist_subscription` WHERE id = '%s'" % (id,) 
cursor.execute(delstatmt) 
conn.commit() 

SICURO!

delstatmt = "DELETE FROM `maillist_subscription` WHERE id = ?" 
cursor.execute(delstatmt, (id,)) 
conn.commit() 
+0

Se qualcuno cerca di iniettare una query, non il cliente esito negativo se l'esecuzione non viene chiamato con 'Multi = true' nell'approccio non sicuro? – user666412

+0

@ user666412 Fallo sempre nel modo giusto e non consentirai a nessuno di giocare con la tua logica di query. Considera il metodo non sicuro sopra, dove l'ID è '123 'O TRUE -' –

+0

giusto ... grazie. – user666412