Escapar de caracteres en Python y sqlite

Tengo una secuencia de comandos de Python que lee archivos de texto de película sin procesar en una base de datos sqlite.

Utilizo re.escape (título) para agregar caracteres de escape en las cadenas para hacerlos seguros antes de ejecutar las inserciones.

Por qué esto no funciona:

In [16]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='\'Allo\ \'Allo\!\"\ \(1982\)'") --------------------------------------------------------------------------- OperationalError Traceback (most recent call last) /home/rajat/Dropbox/amdb/ in () OperationalError: near "Allo": syntax error 

Sin embargo, esto funciona (eliminado \ ‘en dos lugares):

 In [17]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'") Out[17]:  

No puedo resolverlo. Tampoco puedo deshacerme de esas citas principales porque en realidad son parte del título de la película. Gracias.

Lo estás haciendo mal. Literalmente. Deberías estar usando parámetros, como este:

 c.execute("UPDATE movies SET rating = ? WHERE name = ?", (8.7, "'Allo 'Allo! (1982)")) 

De esta forma, no tendrá que hacer ninguna cotización y (si esos valores provienen de alguien que no es de confianza) también estará 100% seguro (aquí) de los ataques de inyección de SQL.

Utilizo re.escape (título) para agregar caracteres de escape en las cadenas para hacerlos seguros.

Tenga en cuenta que re.escape hace que una cadena sea re- segura – nada que ver con hacerla segura. Más bien, como dice @Donal, lo que necesita es el concepto de sustitución de parámetros de la API de Python DB, que hace que las cosas sean “seguras a base de datos” según sea necesario.

SQLite no admite secuencias de escape de barra invertida. Los apóstrofes en los literales de cuerdas se indican duplicándolos: '''Allo ''Allo! (1982)' '''Allo ''Allo! (1982)' .

Pero, como dijo Donal, deberías usar parámetros.

Tengo una sugerencia simple que podría usar para manejar este problema: cuando la cadena de su statement SQL tiene comillas simples: ‘, entonces podría usar comillas dobles para encerrar la cadena de su statement. Y cuando la cadena de su statement SQL tiene comillas dobles: “, entonces podría usar comillas simples:” para encerrar la cadena de su statement. P.ej

 sqlString="UPDATE movies SET rating = '8.7' WHERE name='Allo Allo !' (1982 )" c.execute(sqlString) 

O,

 sqlString='UPDATE movies SET rating = "8.7" WHERE name="Allo Allo !" (1982 )' c.execute(sqlString) 

Esta solución funciona para mí en el entorno Python.