Hack x Crack - Comunidad de Seguridad informática

Programación => Scripting => Python => Mensaje iniciado por: ravenheart en Febrero 18, 2016, 09:24:41 am

Título: Python y MySql
Publicado por: ravenheart en Febrero 18, 2016, 09:24:41 am
¿Cuál es la biblioteca recomendada para acceder a MySql/MariaDb desde Python?

He probado la oficial de Oracle, Connector/Python, pero funciona terriblemente mal, hasta el SELECT más simple me da problemas (luego pongo código, ahora no tengo tiempo), y llevan años sin actualizarlo (o al menos no he encontrado una versión reciente).
Título: Re:Python y MySql
Publicado por: Epyon en Febrero 18, 2016, 09:46:10 am
Mmmm bueno checando la página https://dev.mysql.com/downloads/connector/python/ se puede descargar las versiones compatibles con los sistemas operativos más populares en sus últimas versiones.

Título: Re:Python y MySql
Publicado por: ravenheart en Febrero 18, 2016, 07:06:04 pm
Tengo la versión 2.0.3, que es de enero. No sé por qué, pensaba que era más vieja.

En cualquier caso, el siguiente código falla:

Código: Text
  1.         query = ("SELECT %s")
  2.         cursor = db.cursor()
  3.         cursor.execute(query, ("123",))
  4.         print cursor.rowcount
  5.  
  6.         res = cursor.fetchall()
  7.         cursor.close()
  8.  
cursor.rowcount contiene uno, pero en cuanto llamo a cursor.fetchall() me lanza la siguiente excepción:
Cita de: connector/mysql
InterfaceError(-1, 'No result set to fetch from.', None)

Me ocurre con cualquier SELECT.


El ejemplo está sacado de aquí:
https://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-select.html
Título: Re:Python y MySql
Publicado por: tatoluckyfox en Febrero 29, 2016, 06:31:35 pm
Hola,

Lo primero digo que no se absolutamente nada de SQL y que esta respuesta podría estar mal pero bueno...

La cosa es que he visto la variable "query" tiene un "SELECT" y un "%s". Basándome en la respuesta que da el servidor, indica que no ha encontrado nada para "" que tenia el "%s".

La solución que yo creo que podría funcionar es esta:

Añadir una variable con un string para que "query" tenga el "SELECT" + el string de antes.

Código: Python
  1.  
  2. s = '<lo que busques>' #Es un simple string
  3.  
  4. query = ("SELECT %s" % s)
  5. cursor = db.cursor()
  6. cursor.execute(query, ("123",))
  7. print cursor.rowcount
  8.  
  9. res = cursor.fetchall()
  10. cursor.close()
  11.  

No se si funcionará pero espero que te sirva de ayuda.

Saludos!
Título: Re:Python y MySql
Publicado por: quuim en Febrero 29, 2016, 10:31:56 pm
Hola,

Lo primero digo que no se absolutamente nada de SQL y que esta respuesta podría estar mal pero bueno...

La cosa es que he visto la variable "query" tiene un "SELECT" y un "%s". Basándome en la respuesta que da el servidor, indica que no ha encontrado nada para "" que tenia el "%s".

La solución que yo creo que podría funcionar es esta:

Añadir una variable con un string para que "query" tenga el "SELECT" + el string de antes.

Código: Python
  1.  
  2. s = '<lo que busques>' #Es un simple string
  3.  
  4. query = ("SELECT %s" % s)
  5. cursor = db.cursor()
  6. cursor.execute(query, ("123",))
  7. print cursor.rowcount
  8.  
  9. res = cursor.fetchall()
  10. cursor.close()
  11.  

No se si funcionará pero espero que te sirva de ayuda.

Saludos!

No es eso, el %s se deja para que después bindee el parámetro (o cómo se diga xD) en 'cursor.execute(query, ("123",))', es decir cursor.execute cambiará el %s por "123"
Título: Re:Python y MySql
Publicado por: $francisco en Marzo 10, 2016, 08:48:31 pm
Yo siempre he utilizado MySQLdb y no he tenido ningun problema.
http://mysql-python.sourceforge.net/MySQLdb.html#id7 (http://mysql-python.sourceforge.net/MySQLdb.html#id7)
https://www.python.org/dev/peps/pep-0249/ (https://www.python.org/dev/peps/pep-0249/)
https://pypi.python.org/pypi/MySQL-python/1.2.5 (https://pypi.python.org/pypi/MySQL-python/1.2.5)

Te dejo donde esta toda la documentación de esta api.

Creo que se donde esta el problema.

Código: [Seleccionar]
cursor.execute(query, ("123",))
No estas pasando ningun parametro fijate en este simple ejemplo.

Código: Python
  1. c=db.cursor()
  2. max_price=5
  3. c.execute("""SELECT spam, eggs, sausage FROM breakfast
  4.          WHERE price < %s""", (max_price,))

en este ejemplo tu estarias haciendo lo siguiente

Código: Python
  1. c=db.cursor()
  2. s = "5"
  3. query = "SELECT spam, eggs, sausage FROM breakfast WHERE price < %s" %s
  4. c.execute(query, (s,))

Fijate que ya formateaste el texto en la variable query y despues en el metodo "execute" intentas volver a formatearla pasandole como tupla "(s,)".

Creo que es eso.

Título: Re:Python y MySql
Publicado por: ravenheart en Marzo 10, 2016, 11:29:12 pm
Creo que es eso.

No, no es eso. Examinando la variable "cursor" con visual studio comprobé que la sentencia almacenada internamente fuera "SELECT 123". Además, los INSERT me funcionaban. Y por si quedase alguna duda, pasé a pyMySql, que utiliza la misma sintaxis, y todo funcionaba.

Aparte de que como dije cursor.rowcount me devolvía 1.
Título: Re:Python y MySql
Publicado por: $francisco en Marzo 11, 2016, 01:25:39 am
La verdad que yo siempre hice la consulta en el string, toda en la misma variable pasandole un solo parametro y no tuve ningun problema, si te funciana pymysql perfecto aunque no deberia darte ningun problema xd
Título: Re:Python y MySql
Publicado por: ravenheart en Marzo 11, 2016, 08:41:46 am
toda en la misma variable pasandole un solo parametro y no tuve ningun problema
¿Has oído hablar de Sql Injection? ;-)
Título: Re:Python y MySql
Publicado por: $francisco en Marzo 11, 2016, 02:51:25 pm
Si claro jeje  ;D
Título: Re:Python y MySql
Publicado por: $francisco en Marzo 20, 2016, 05:36:32 pm
Bueno aunque ya sea un poco tarde pero me fije que es cierto que tu script está bien lo unico que veo es que no le dices en que tabla tiene que buscar.
Título: Re:Python y MySql
Publicado por: ravenheart en Marzo 20, 2016, 11:45:08 pm
Para hacer un SELECT constante en MariaDb no hace falta especificar tabla.