Me está costando conseguir algunos sql en python para pasar MySQLdb correctamente. Es el formato de cadenas de pitones que me está matando.Formatos de cadena de Python con comodines SQL y LIKE
Mi declaración sql usa la palabra clave LIKE con comodines. He intentado varias cosas diferentes en Python. El problema es que una vez que uno de ellos funciona, hay una línea de código en MySQLdb que eructa en formato de cadena.
Intento 1:
"SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '%%s%'" % (query)
Esto es un no ir. Llego valor de error:
ValueError: unsupported format character ''' (0x27) at index 128
Intento 2:
"SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '\%%s\%'" % (query)
puedo obtener el mismo resultado del intento 1.
Intento 3:
like = "LIKE '%" + str(query) + "%'" totalq = "SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username " + like
Esto crea correctamente el totalq variable, pero ahora cuando voy a ejecutar la consulta obtengo errores de MySQLdb:
File "build/bdist.macosx-10.6-universal/egg/MySQLdb/cursors.py", line 158, in execute query = query % db.literal(args) TypeError: not enough arguments for format string
Intento 4:
like = "LIKE '\%" + str(query) + "\%'" totalq = "SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username " + like
Este es el mismo resultado que el intento 3.
Todo esto parece muy extraño. ¿Cómo puedo usar comodines en sentencias sql con python?
Para eco @bernie a continuación: De docs psycopg: http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters: "Nunca, nunca, nunca usar Python concatenación de cadenas (+) o interpolación de parámetros de cadena (%) para pasar variables a una cadena de consulta SQL. . Ni siquiera a punta de pistola "Además de los ataques de inyección SQL, un segundo beneficio es que el conductor 'puede convertir automáticamente los objetos de Python desde y hacia los literales SQL: el uso de esta función, su código será más robusto y fiable un ingenuo' Este frente." enfoque a la composición de cadenas de consulta, por ejemplo .. El uso de la concatenación de cadenas" –