2011-07-15 32 views
5

Estoy almacenando nombres de archivos y rutas de archivos en mySQL. Recuperarlos de la base de datos usando la expresión LIKE requiere que escape todos los caracteres de nombre de archivo permitidos que colisionan con los caracteres especiales de mysql. Me complace simplemente usar el método string.replace() de Python, pero me preguntaba si había un método más estándar o incorporado para desinfectar rutas de archivos con SQLalchemy o tratar con rutas de archivos en mySQL en general.escapando caracteres especiales usando sqlalchemy

Editar: Un poco más de información. Necesito que la solución sea independiente del sistema operativo y establecida. No necesita ser implementado en SA. Aceptaré cualquier procedimiento de codificación que funcione. Guardando eso, necesito una lista de todos los caracteres que necesitan ser escapados y una elección inteligente de un char de escape.

Respuesta

-2

¿Por qué necesita escapar de las rutas de archivos? En la medida en que no esté escribiendo manualmente las consultas de seleccionar/insertar, SQLAlchemy se ocupará del escape cuando genere la consulta internamente.

Las rutas de archivos se pueden insertar como están en la base de datos.

+1

Estoy usando el método '.like()' SA para seleccionar rutas de archivos. Que (según entiendo) usa '%' y '_' (¿hay otros?) Como comodines. Ambos también son válidos filname chrs. ¡Sería ciertamente extraño si SA pudiera leer mi mente y saber cuándo estaba usando '_' como un comodín de búsqueda vs. un carácter literal en un nombre de archivo y" cuídamela "por mí! :) – Paul

+0

@Toofan: Paul tiene razón: SQLAlchemy no hará esto para '.like()' y consortes ('.contains()', '.startswith()' etc ...). Proporciona un argumento de 'escape' para estos métodos, pero debe escapar de la cadena usted mismo y proporcionar el carácter de escape utilizado. – Steven

0

SQLAlchemy desinfecte para usted si va a utilizar consultas regulares. Tal vez el problema que usas como cláusula. Al igual que requieren escape adicional para tales símbolos: _%. Por lo tanto, necesitará reemplazar los métodos si desea citar como expresión.

+0

El hecho de que uso '.like()' no es el problema, es el requisito principal. ¿Solo necesito escapar '%' y '_'? ¿Cómo manejar citas literales, corchetes y barras diagonales inversas? – Paul

+0

Necesita escaparse solo 3 caracteres, _,%, /. _ y% son comodines,/- símbolo de escape. Otra parte de la consulta se desinfectará automáticamente – varela

0

No necesita hacer nada SQLAlchemy lo hará por usted.

+0

lea los comentarios aquí: http://stackoverflow.com/questions/6713715/escaping-special-characters-using-sqlalchemy/6720094#6720094 – Paul

+0

luego debe escribir su función de escape por usted mismo : path.replace ('%', '\\%'). replace ('_', '\\ _') –

+0

O puede usar sql como tal: select * from table donde un escape como 'andre *%' '*'; –

-3

Como sé, no hay lo que está buscando en SQLAlchemy. Simplemente vaya al método basestring.replace() usted mismo.

+1

Sí. Lo sé. Lo digo en mi pregunta. ¿Qué debería reemplazar?¿No son '*' y '\' nombres de archivo linux válidos? ¿No hay alguna codificación estándar que deba usar? He considerado hacer una codificación de URL pero con un escape o un doble% en lugar de un%, pero se vuelve desordenado rápidamente. Estoy buscando una solución establecida. – Paul