[pyar] INSERTAR UNA IMAGEN EN UNA BASE DE DATOS MYSQL

Gerardo Rios gsr.5392.tec en gmail.com
Lun Feb 29 23:10:51 ART 2016


HOLA ESTIMADOS:
POR FIN LO PUDE SOLUCIONAR, TENIA UNA ERROR EN LA CONSULTA SQL DE INSERT.
AHORA LE PASO EL CODIGO QUE ME FUNCIONA, GRACIAS POR SU TIEMPO EN BRINDARME
UNA MANO:

def CargaImagen():

  #Establecemos la conexion con la base de datos
  # Variable con la configuracion de la conexion
  bd_imagenes = mysql.connector.connect(user='******', password='*******',
host='*************', database='imagenes_prueba')

  #Variable 'cursor' que se encargara de realizar las consultas SQL y
contendra la informacion para esa consulta

  cursor = bd_imagenes.cursor()


#--------------------------------------------------------------------------------------------------------------


  #CARGAR LA IMAGEN

  #Abro el archivo de imagen para cargar sus contenidos
  archivo = "/home/gerardo/Escritorio/PYTHON/IMAGEN/piramide.jpg"

  imagen = Image.open(archivo)

  #PARA ENCONTRAR EL FORMATO DE LA IMAGEN
  formato = imagen.format


  #Guardamos la imagen en la BD
  #datos  = 'encoded_b64 = """' +
base64.encodestring(open(archivo,"rb").read()) + '"""' #transformamos la
imagen en datos
  datos  = base64.encodestring(open(archivo,"rb").read()) #transformamos la
imagen en datos

  sql = 'INSERT INTO IMAGENES2 (imagen,tipo) VALUES ("% s","%
s")'%(datos,formato)
  try:
   #Ejecutamos el comando
    cursor.execute(sql)
   #Efectuamos los cambios en la base de datos
    bd_imagenes.commit()
    print "Los datos se agregaron con exito"
  except Exception, e:
    print e

   #Si se genero algún error revertamos la operación
    bd_imagenes.rollback()
    print "no se pudo agregar los datos"


#-------------------------------------------------------------------------------------------------------------

  # Cerramos cursor
  cursor.close()


#--------------------------------------------------------------------------------------------------------------

  #DESCONEXION DE LA BASE DE DATOS
  # Nos desconectamos de la base de Datos
  bd_imagenes.close()

El 29 de febrero de 2016, 13:04, Lucio <lucionardelli en gmail.com> escribió:

> Buenas tardes,
>
> yo recomendaría aprovechar la sanitización (puaj!) de datos que te da el
> conector sql, pasando los argumentos al cursor como recomendó @Gabriel
> Davini
>
> Como indica la excepción, el problema está en que al hacer:
>
>  sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" , (datos,
>> formato)
>>
>
> lo que estás generando (como también dijeron), es una tupla. En
> particular, una cuyo primer argumento es un string y  la segunda es otra
> tupla:
>
>
>>  >>> datos = 'foo'
>
> >>> formato = 'bar'
>
> >>> sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
>> (datos, formato)
>
> >>> print sql
>>
> ('INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)', ('foo', 'bar'))
>
> >>> sql[0]
>
> 'INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)'
>
> >>> sql[1]
>
> ('foo', 'bar')
>
>
> Te recomendaría le pases los argumentas al cursor:
>
> sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""
>
>   try:
>>    #Ejecutamos el comando
>>     cursor.execute(sql, datos, formato)
>>    #Efectuamos los cambios en la base de datos
>>     bd_imagenes.commit()
>>     print "Los datos se agregaron con exito"
>>   except:
>>
>
> donde estás definiendo sql como un string (no una tupla) y le estás
> "indicando" al cursor que tiene que ejecutar la consulta sql y poner en los
> "agujeros" (los %s digamos) los valores pasados como argumento.
>
> Espero que se entienda. saludos
>
>
> El 29 de febrero de 2016, 10:52, Gabriel Davini <
> gabrielfranciscodavini en gmail.com> escribió:
>
>>
>> 2016-02-28 21:34 GMT-03:00 Gerardo Rios <gsr.5392.tec en gmail.com>:
>>
>>>
>>> Wrong number of arguments during string formatting
>>>
>>> QUE SI LO TRADUZCO ME DICE: Número incorrecto de argumentos en el
>>> formato de cadenas
>>>
>>> PARA MI QUE EL ERROR ESTA EN EL TIPO DE DATOS DE LA IMAGEN, YO LO PUSE
>>> COMO LONGBLOB Y CREO QUE TIENE QUE SER BLOB SOLAMENTE, VOY A VER QUE ME DA.
>>>
>>
>> No, no tiene que ver con el tipo de dato de la columna
>>
>>
>>>   #se carga los datos en la base de datos
>>>>   sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
>>>> (datos, formato)
>>>>
>>>
>> Lo que pasa es que aca estás creando una tupla, mirá:
>>
>> >>> datos = "foo"
>> >>> formato = "bar"
>> >>> sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
>> (datos, formato)  # aca deberías reemplazar la , por %
>> >>> print sql
>> ('INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)', ('foo', 'bar'))
>> >>> print type(sql)
>> <type 'tuple'>
>>
>> Lo que tendrías que hacer es:
>>
>> >>> sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" %
>> (datos, formato)
>> >>> print sql
>> INSERT INTO IMAGENES (imagen,tipo) VALUES (foo,bar)
>> >>> print type(sql)
>> <type 'str'>
>>
>> Saludos
>> --
>> Gabriel.
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160229/91b1e52b/attachment-0001.html>


Más información sobre la lista de distribución pyar