2010-10-20 11 views
14

que tienen un problema con la eliminación de un registro de base de datos sqlite3:¿Cómo eliminar el registro de la tabla?

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 

Todo es bueno, pero borrado no está disponible! ¿Alguien tiene alguna idea?

+2

¿qué exactamente no está funcionando? ¿Qué versión de python estás usando? – SilentGhost

+0

Estoy usando Python 3.1 – Risino

+2

Genial, entonces ¿qué significa * eliminar no funciona * realmente significa? – SilentGhost

Respuesta

-4

Gracias a todos los que intentaron ayudar. El código correcto es:

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

¡Esto es vulnerable a la inyección SQL! – thirtythreeforty

-2

Revisa los permisos del archivo.

Un aparte, yo prefiero el método tokenized:

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

Ingrese el nombre: ... ''; TABLA DE DESCARGAS Zoznam;' eumiro

+0

Limpie todas las entradas antes de ejecutarlas con el cursor. No es diferente de lo que ya está allí. –

+0

también, cuyo nombre pido que no borre de SQL – Risino

-1

yo le aconsejo que hacer primero una cadena para la consulta, y luego ejecutarlo. ex:

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

en serio, ¿de dónde sacas esas ideas? – SilentGhost

+0

No sé por qué, pero tuve muchos problemas tratando de ejecutar consultas en sqlite que incluía la consulta de cadena real como el primer argumento del método de ejecución, pero de alguna manera pude resolver este problema creando una variable fuera de la cadena y luego pasar al método de ejecución. – Kelmer

+1

Como se indicó en la respuesta anterior, * siempre * usa la versión parametrizada de los comandos sqlite en lugar de crear cadenas de consulta a mano. Esto evitará (o al menos reducirá en gran medida el riesgo) las inyecciones de SQL. – shiin

13

la sintaxis correcta para una consulta parameterized es:

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

Asegúrese de que el parámetro utiliza la coma, para que sea una tupla pitón.

Esto ayudará a evitar la inyección SQL, que es posible cuando se pasa una cadena formateada. Más información sobre la inyección de SQL here

Publicación relacionada here.

+0

hay un error tipográfico con el último carácter de la cadena. El soporte debe ser eliminado. No puedo editarlo, ya que las ediciones deben tener 6 caracteres aparentemente. –

+0

¡Uy! ¡Gracias! Fijo. –

0

intento con:

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

Sin la '', y el '?' entre '()'

Cuestiones relacionadas