Discussion:
INSERTAR UNA IMAGEN EN UNA BASE DE DATOS MYSQL
(too old to reply)
Gerardo Rios
2016-02-27 02:13:47 UTC
Permalink
Hola chicos:
Quiero insertar una imagen de formato jpg en la tabla IMAGENES de la base
de datos "imagenes_prueba" pero no me deja insertarla ni actualizar la base
de datos. Aqui le paso el codigo:

# -*- coding: UTF-8 -*-

import mysql.connector
#import pygame
from PIL import Image
import base64

def CargaTablaImagenes():

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()


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

#CREAMOS LA TABLA IMAGENES

sql = "CREATE TABLE IMAGENES (id INT NOT NULL auto_increment,imagen
LONGBLOB,tipo VARCHAR(255),PRIMARY KEY (id))"

cursor.execute(sql)


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

# Cerramos cursor
cursor.close()


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

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


def CargaImagen():


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


#La guardamos en la BD

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

#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (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:
#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()
Julian Agustin Cardonnet
2016-02-27 02:46:54 UTC
Permalink
Hola Gerardo,
Podes dar datos mas precisos sobre el problema que estas teniendo. Por ej,
a que te referis exactamente con "no me deja insertarla ni actualizar la
base de datos"? Te tira una excepcion? Cual?
Otra cosa que no me queda clara es si te falla el insert de la imagen o
directamente el intentar crear la tabla...

Saludos,
Julian
Post by Gerardo Rios
Quiero insertar una imagen de formato jpg en la tabla IMAGENES de la base
de datos "imagenes_prueba" pero no me deja insertarla ni actualizar la base
# -*- coding: UTF-8 -*-
import mysql.connector
#import pygame
from PIL import Image
import base64
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()
#--------------------------------------------------------------------------------------------------------------
#CREAMOS LA TABLA IMAGENES
sql = "CREATE TABLE IMAGENES (id INT NOT NULL auto_increment,imagen
LONGBLOB,tipo VARCHAR(255),PRIMARY KEY (id))"
cursor.execute(sql)
#-------------------------------------------------------------------------------------------------------------
# Cerramos cursor
cursor.close()
#--------------------------------------------------------------------------------------------------------------
#DESCONEXION DE LA BASE DE DATOS
# Nos desconectamos de la base de datos
bd_imagenes.close()
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
#La guardamos en la BD
datos = 'encoded_b64 = \\\n"""' +
base64.encodestring(open(archivo,"rb").read()) + '"""' #transformamos la
imagen en datos
#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
#Ejecutamos el comando
cursor.execute(sql)
#Efectuamos los cambios en la base de datos
bd_imagenes.commit()
print "Los datos se agregaron con exito"
#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()
_______________________________________________
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
Gerardo Rios
2016-02-27 15:06:29 UTC
Permalink
hola chicos:
si, cuando reviso la tabla imagenes veo que no se cargo los datos de las
variables "datos e imagenes" y directamente se dirige a except donde me
muestra el mensaje "no se puedo agregar los datos". Me falla el insert de
la imagen. La tabla imagenes se creo exitosamente.

Saludos

Gerardo

El 26 de febrero de 2016, 23:46, Julian Agustin Cardonnet <
Post by Julian Agustin Cardonnet
Hola Gerardo,
Podes dar datos mas precisos sobre el problema que estas teniendo. Por ej,
a que te referis exactamente con "no me deja insertarla ni actualizar la
base de datos"? Te tira una excepcion? Cual?
Otra cosa que no me queda clara es si te falla el insert de la imagen o
directamente el intentar crear la tabla...
Saludos,
Julian
Post by Gerardo Rios
Quiero insertar una imagen de formato jpg en la tabla IMAGENES de la base
de datos "imagenes_prueba" pero no me deja insertarla ni actualizar la base
# -*- coding: UTF-8 -*-
import mysql.connector
#import pygame
from PIL import Image
import base64
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()
#--------------------------------------------------------------------------------------------------------------
#CREAMOS LA TABLA IMAGENES
sql = "CREATE TABLE IMAGENES (id INT NOT NULL auto_increment,imagen
LONGBLOB,tipo VARCHAR(255),PRIMARY KEY (id))"
cursor.execute(sql)
#-------------------------------------------------------------------------------------------------------------
# Cerramos cursor
cursor.close()
#--------------------------------------------------------------------------------------------------------------
#DESCONEXION DE LA BASE DE DATOS
# Nos desconectamos de la base de datos
bd_imagenes.close()
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
#La guardamos en la BD
datos = 'encoded_b64 = \\\n"""' +
base64.encodestring(open(archivo,"rb").read()) + '"""' #transformamos la
imagen en datos
#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
#Ejecutamos el comando
cursor.execute(sql)
#Efectuamos los cambios en la base de datos
bd_imagenes.commit()
print "Los datos se agregaron con exito"
#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()
_______________________________________________
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
_______________________________________________
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
Gabriel Davini
2016-02-27 15:27:00 UTC
Permalink
Post by Gerardo Rios
#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
Aca estás creando una tupla. Me parece que lo que estás intentando hacer
aca es:

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" % (datos,
formato)

o mejor:

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""

cursor.execute(sql, datos, formato)

Digo mejor porque de esta manera el connector de mysql se debería encargar
de sanitizar las variables y evitar asi algun ataque por inyección de SQL.
Post by Gerardo Rios
#Ejecutamos el comando
cursor.execute(sql)
#Efectuamos los cambios en la base de datos
bd_imagenes.commit()
print "Los datos se agregaron con exito"
#Si se genero algún error revertamos la operación
bd_imagenes.rollback()
print "no se pudo agregar los datos"
*No* es recomendable[0] atrapar excepciones de forma genérica, ya que te
puede llevar a no identificar cuál es el error y por ende no poder
solucionarlo. Si no estás seguro de qué excepciones te puede crear una
parte del código, podés hacer algo asi[1] al principio, cosa de poder
debuguearlo, y luego si agregar las excepciones específicas.

Saludos!

[0] http://www.tutorialspoint.com/python/python_exceptions.htm
[1] http://linkode.org/eNJoBYXPc36bgha4mU7fD2
--
Gabriel.
Gerardo Rios
2016-02-29 00:34:02 UTC
Permalink
HOLA GABRIEL DAVINI:

GRACIAS POR PASARME LA LISTA DE EXCEPCIONES, AGREGUE LA EXCEPCION GENERICA
COMO ME PASASTE EN EL EJEMPLO Y LA EXCEPCION ME TIRA EL SIGUIENTE ERROR:

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.

HACIENDO LA PRUEBA, ME SALE EL MISMO MENSAJE: Wrong number of arguments
during string formatting


SALUDOS

GERARDO

El 27 de febrero de 2016, 12:27, Gabriel Davini <
Post by Gabriel Davini
Post by Gerardo Rios
#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
Aca estás creando una tupla. Me parece que lo que estás intentando hacer
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" % (datos,
formato)
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""
cursor.execute(sql, datos, formato)
Digo mejor porque de esta manera el connector de mysql se debería encargar
de sanitizar las variables y evitar asi algun ataque por inyección de SQL.
Post by Gerardo Rios
#Ejecutamos el comando
cursor.execute(sql)
#Efectuamos los cambios en la base de datos
bd_imagenes.commit()
print "Los datos se agregaron con exito"
#Si se genero algún error revertamos la operación
bd_imagenes.rollback()
print "no se pudo agregar los datos"
*No* es recomendable[0] atrapar excepciones de forma genérica, ya que te
puede llevar a no identificar cuál es el error y por ende no poder
solucionarlo. Si no estás seguro de qué excepciones te puede crear una
parte del código, podés hacer algo asi[1] al principio, cosa de poder
debuguearlo, y luego si agregar las excepciones específicas.
Saludos!
[0] http://www.tutorialspoint.com/python/python_exceptions.htm
[1] http://linkode.org/eNJoBYXPc36bgha4mU7fD2
--
Gabriel.
_______________________________________________
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
Julian Agustin Cardonnet
2016-02-29 01:43:07 UTC
Permalink
Lo que te esta fallando es la sustitucion en la cadena porque te falta el
operador %.
Asi que en en vez de hacer:
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" , (datos,
formato)
proba con:
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" %(datos,
formato) // Reemplace la coma por el signo de porcentaje.

La diferencia entre Long Blob y Blob es solo el tamaño, asi que en todo
caso te daria una excepcion quejandose de que los datos no caben en el
campo.

Respecto a como guardar los archivos, a menos que tengas una buena razon
para no hacerlo, yo empezaria simplemente metiendolos en alguna carpeta y
en la DB tan solo guardar el nombre del archivo. De todas formas, sin saber
cuales son los escenarios de uso asi en el aire es medio dificil
recomendarte como encarar el almacenamiento de las imagenes.

Saludos,
Julian
Post by Gerardo Rios
GRACIAS POR PASARME LA LISTA DE EXCEPCIONES, AGREGUE LA EXCEPCION GENERICA
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.
HACIENDO LA PRUEBA, ME SALE EL MISMO MENSAJE: Wrong number of arguments
during string formatting
SALUDOS
GERARDO
El 27 de febrero de 2016, 12:27, Gabriel Davini <
Post by Gabriel Davini
Post by Gerardo Rios
#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
Aca estás creando una tupla. Me parece que lo que estás intentando hacer
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" %
(datos, formato)
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""
cursor.execute(sql, datos, formato)
Digo mejor porque de esta manera el connector de mysql se debería
encargar de sanitizar las variables y evitar asi algun ataque por inyección
de SQL.
Post by Gerardo Rios
#Ejecutamos el comando
cursor.execute(sql)
#Efectuamos los cambios en la base de datos
bd_imagenes.commit()
print "Los datos se agregaron con exito"
#Si se genero algún error revertamos la operación
bd_imagenes.rollback()
print "no se pudo agregar los datos"
*No* es recomendable[0] atrapar excepciones de forma genérica, ya que te
puede llevar a no identificar cuál es el error y por ende no poder
solucionarlo. Si no estás seguro de qué excepciones te puede crear una
parte del código, podés hacer algo asi[1] al principio, cosa de poder
debuguearlo, y luego si agregar las excepciones específicas.
Saludos!
[0] http://www.tutorialspoint.com/python/python_exceptions.htm
[1] http://linkode.org/eNJoBYXPc36bgha4mU7fD2
--
Gabriel.
_______________________________________________
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
_______________________________________________
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
Gabriel Davini
2016-02-29 13:52:35 UTC
Permalink
Post by Gerardo Rios
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
Post by Gerardo Rios
#se carga los datos en la base de datos
Post by Gerardo Rios
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
datos = "foo"
formato = "bar"
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato) # aca deberías reemplazar la , por %
Post by Gerardo Rios
Post by Gerardo Rios
print sql
('INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)', ('foo', 'bar'))
Post by Gerardo Rios
Post by Gerardo Rios
print type(sql)
<type 'tuple'>
Post by Gerardo Rios
Post by Gerardo Rios
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" %
(datos, formato)
Post by Gerardo Rios
Post by Gerardo Rios
print sql
INSERT INTO IMAGENES (imagen,tipo) VALUES (foo,bar)
Post by Gerardo Rios
Post by Gerardo Rios
print type(sql)
<type 'str'>

Saludos
--
Gabriel.
Lucio
2016-02-29 16:04:28 UTC
Permalink
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,
Post by Gerardo Rios
formato)
lo que estás generando (como también dijeron), es una tupla. En particular,
Post by Gerardo Rios
Post by Gerardo Rios
datos = 'foo'
formato = 'bar'
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
Post by Gerardo Rios
print sql
('INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)', ('foo', 'bar'))
Post by Gerardo Rios
Post by Gerardo Rios
sql[0]
'INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)'
Post by Gerardo Rios
Post by Gerardo Rios
sql[1]
('foo', 'bar')


Te recomendaría le pases los argumentas al cursor:

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""
Post by Gerardo Rios
#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"
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 <
Post by Gerardo Rios
Post by Gerardo Rios
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
Post by Gerardo Rios
#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
datos = "foo"
formato = "bar"
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato) # aca deberías reemplazar la , por %
Post by Gerardo Rios
print sql
('INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)', ('foo', 'bar'))
Post by Gerardo Rios
print type(sql)
<type 'tuple'>
Post by Gerardo Rios
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" %
(datos, formato)
Post by Gerardo Rios
print sql
INSERT INTO IMAGENES (imagen,tipo) VALUES (foo,bar)
Post by Gerardo Rios
print type(sql)
<type 'str'>
Saludos
--
Gabriel.
_______________________________________________
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
Gerardo Rios
2016-03-01 02:10:51 UTC
Permalink
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()
Post by Lucio
Buenas tardes,
yo recomendaría aprovechar la sanitización (puaj!) de datos que te da el
Davini
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" , (datos,
Post by Gerardo Rios
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
Post by Gerardo Rios
Post by Gerardo Rios
datos = 'foo'
formato = 'bar'
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
Post by Gerardo Rios
print sql
('INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)', ('foo', 'bar'))
Post by Gerardo Rios
Post by Gerardo Rios
sql[0]
'INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)'
Post by Gerardo Rios
Post by Gerardo Rios
sql[1]
('foo', 'bar')
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""
Post by Gerardo Rios
#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"
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 <
Post by Gerardo Rios
Post by Gerardo Rios
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
Post by Gerardo Rios
#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato)
datos = "foo"
formato = "bar"
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" ,
(datos, formato) # aca deberías reemplazar la , por %
Post by Gerardo Rios
print sql
('INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)', ('foo', 'bar'))
Post by Gerardo Rios
print type(sql)
<type 'tuple'>
Post by Gerardo Rios
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" %
(datos, formato)
Post by Gerardo Rios
print sql
INSERT INTO IMAGENES (imagen,tipo) VALUES (foo,bar)
Post by Gerardo Rios
print type(sql)
<type 'str'>
Saludos
--
Gabriel.
_______________________________________________
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
_______________________________________________
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
Ricardo Daniel Quiroga
2016-02-27 19:21:34 UTC
Permalink
Mi duda existencial es: realmente necesitas meter la imagen en la bd

-----Mensaje original-----
De: Gabriel Davini
Enviado: 27/02/2016 12:27
Para: Python Argentina
Asunto: Re: [pyar] INSERTAR UNA IMAGEN EN UNA BASE DE DATOS MYSQL




2016-02-26 23:13 GMT-03:00 Gerardo Rios <***@gmail.com>:


#se carga los datos en la base de datos

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" , (datos, formato)




Aca estás creando una tupla. Me parece que lo que estás intentando hacer aca es:

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" % (datos, formato)



o mejor:

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""



cursor.execute(sql, datos, formato)



Digo mejor porque de esta manera el connector de mysql se debería encargar de sanitizar las variables y evitar asi algun ataque por inyección de SQL.





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:

#Si se genero algún error revertamos la operación

bd_imagenes.rollback()

print "no se pudo agregar los datos"


*No* es recomendable[0] atrapar excepciones de forma genérica, ya que te puede llevar a no identificar cuál es el error y por ende no poder solucionarlo. Si no estás seguro de qué excepciones te puede crear una parte del código, podés hacer algo asi[1] al principio, cosa de poder debuguearlo, y luego si agregar las excepciones específicas.

Saludos!

[0] http://www.tutorialspoint.com/python/python_exceptions.htm
[1] http://linkode.org/eNJoBYXPc36bgha4mU7fD2
--
Gabriel.
Carlos Miguel FARIAS
2016-02-28 16:41:59 UTC
Permalink
El otro día explicaron que ponen la imagen dentro de la bd para asegurar el
backup de la misma.
Saludos: Miguel

El 27 de febrero de 2016, 16:21, Ricardo Daniel Quiroga <
Post by Ricardo Daniel Quiroga
Mi duda existencial es: realmente necesitas meter la imagen en la bd
------------------------------
De: Gabriel Davini
Enviado: 27/02/2016 12:27
Para: Python Argentina
Asunto: Re: [pyar] INSERTAR UNA IMAGEN EN UNA BASE DE DATOS MYSQL
Post by Gerardo Rios
#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" , (datos, formato)
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" % (datos, formato)
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""
cursor.execute(sql, datos, formato)
Digo mejor porque de esta manera el connector de mysql se debería encargar
de sanitizar las variables y evitar asi algun ataque por inyección de SQL.
Post by Gerardo Rios
#Ejecutamos el comando
cursor.execute(sql)
#Efectuamos los cambios en la base de datos
bd_imagenes.commit()
print "Los datos se agregaron con exito"
#Si se genero algún error revertamos la operación
bd_imagenes.rollback()
print "no se pudo agregar los datos"
*No* es recomendable[0] atrapar excepciones de forma genérica, ya que te
puede llevar a no identificar cuál es el error y por ende no poder
solucionarlo. Si no estás seguro de qué excepciones te puede crear una
parte del código, podés hacer algo asi[1] al principio, cosa de poder
debuguearlo, y luego si agregar las excepciones específicas.
Saludos!
[0] http://www.tutorialspoint.com/python/python_exceptions.htm
[1] http://linkode.org/eNJoBYXPc36bgha4mU7fD2
--
Gabriel.
_______________________________________________
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
Gerardo Rios
2016-02-28 23:56:20 UTC
Permalink
HOLA SR. RICARDO DANIEL QUIROGA:

SI, ESTIMADO RICARDO, ES LA IDEA QUE SE ME OCURRIO, LA DE GUARDAR LA IMAGEN
EN UNA BASE DE DATOS; ¿PARA VOS CUAL SERIA EL OTRO MEDIO DE GUARDAR LA
IMAGEN?

SALUDOS

ATTE

GERARDO

El 27 de febrero de 2016, 16:21, Ricardo Daniel Quiroga <
Post by Ricardo Daniel Quiroga
Mi duda existencial es: realmente necesitas meter la imagen en la bd
------------------------------
De: Gabriel Davini
Enviado: 27/02/2016 12:27
Para: Python Argentina
Asunto: Re: [pyar] INSERTAR UNA IMAGEN EN UNA BASE DE DATOS MYSQL
Post by Gerardo Rios
#se carga los datos en la base de datos
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" , (datos, formato)
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" % (datos, formato)
sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""
cursor.execute(sql, datos, formato)
Digo mejor porque de esta manera el connector de mysql se debería encargar
de sanitizar las variables y evitar asi algun ataque por inyección de SQL.
Post by Gerardo Rios
#Ejecutamos el comando
cursor.execute(sql)
#Efectuamos los cambios en la base de datos
bd_imagenes.commit()
print "Los datos se agregaron con exito"
#Si se genero algún error revertamos la operación
bd_imagenes.rollback()
print "no se pudo agregar los datos"
*No* es recomendable[0] atrapar excepciones de forma genérica, ya que te
puede llevar a no identificar cuál es el error y por ende no poder
solucionarlo. Si no estás seguro de qué excepciones te puede crear una
parte del código, podés hacer algo asi[1] al principio, cosa de poder
debuguearlo, y luego si agregar las excepciones específicas.
Saludos!
[0] http://www.tutorialspoint.com/python/python_exceptions.htm
[1] http://linkode.org/eNJoBYXPc36bgha4mU7fD2
--
Gabriel.
_______________________________________________
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
Ricardo Daniel Quiroga
2016-02-29 05:43:28 UTC
Permalink
Mmm guardarlas en Amazon digamos una buena idea si va a ser un servicio web, como dijeron es mas practico una carpeta generarle nombres aleatorio y solo guardar el nombre en la bd, ya que si mas no recuerdo creo que afectan la performance los dato blob una tabla con imágenes crece demasiado rápido y las búsquedas en tablas con ese tipo de datos se ralentizan, además tener las imágenes en una carpeta evita cualquier tarea de reconversión de las misma y gasto de procesamiento. Digamos las imágenes hoy en dia no pesan ya un par de Kb para considerarlo una buena idea. Por eso me parecía extraño ese tipo de implementación. saludos

-----Mensaje original-----
De: Julian Agustin Cardonnet
Enviado: 28/02/2016 22:43
Para: Python Argentina
Asunto: Re: [pyar] INSERTAR UNA IMAGEN EN UNA BASE DE DATOS MYSQL




Lo que te esta fallando es la sustitucion en la cadena porque te falta el operador %.

Asi que en en vez de hacer:

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" , (datos, formato)

proba con:

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" %(datos, formato) // Reemplace la coma por el signo de porcentaje.



La diferencia entre Long Blob y Blob es solo el tamaño, asi que en todo caso te daria una excepcion quejandose de que los datos no caben en el campo.

Respecto a como guardar los archivos, a menos que tengas una buena razon para no hacerlo, yo empezaria simplemente metiendolos en alguna carpeta y en la DB tan solo guardar el nombre del archivo. De todas formas, sin saber cuales son los escenarios de uso asi en el aire es medio dificil recomendarte como encarar el almacenamiento de las imagenes.




Saludos,
Julian




El 28 de febrero de 2016, 21:34, Gerardo Rios <***@gmail.com> escribió:


HOLA GABRIEL DAVINI:



GRACIAS POR PASARME LA LISTA DE EXCEPCIONES, AGREGUE LA EXCEPCION GENERICA COMO ME PASASTE EN EL EJEMPLO Y LA EXCEPCION ME TIRA EL SIGUIENTE ERROR:




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.




HACIENDO LA PRUEBA, ME SALE EL MISMO MENSAJE: Wrong number of arguments during string formatting







SALUDOS




GERARDO





El 27 de febrero de 2016, 12:27, Gabriel Davini <***@gmail.com> escribió:








2016-02-26 23:13 GMT-03:00 Gerardo Rios <***@gmail.com>:


#se carga los datos en la base de datos

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" , (datos, formato)




Aca estás creando una tupla. Me parece que lo que estás intentando hacer aca es:

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)""" % (datos, formato)



o mejor:

sql = """INSERT INTO IMAGENES (imagen,tipo) VALUES (% s,% s)"""



cursor.execute(sql, datos, formato)



Digo mejor porque de esta manera el connector de mysql se debería encargar de sanitizar las variables y evitar asi algun ataque por inyección de SQL.





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:

#Si se genero algún error revertamos la operación

bd_imagenes.rollback()

print "no se pudo agregar los datos"


*No* es recomendable[0] atrapar excepciones de forma genérica, ya que te puede llevar a no identificar cuál es el error y por ende no poder solucionarlo. Si no estás seguro de qué excepciones te puede crear una parte del código, podés hacer algo asi[1] al principio, cosa de poder debuguearlo, y luego si agregar las excepciones específicas.

Saludos!

[0] http://www.tutorialspoint.com/python/python_exceptions.htm
[1] http://linkode.org/eNJoBYXPc36bgha4mU7fD2
--
Gabriel.


_______________________________________________
pyar mailing list ***@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 ***@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
Loading...