Hace un par de días Walter de Nicaragua me consultaba:
Estoy trabajando en una aplicacion para niños en las xo´s , estoy usando sqlite3 para guardar la informacion, y tambien necesito guardar fotos dentro de la base de datos.
Como la fotos seran tomadas con la camara de las propias XO's, asumo no son tan grande en resolucion y tamaño.
Tambien, estuve revizando la lista de correo, pero no hay nada concreto, y a decir verdad recomiendan que guarde una referencia de la imagen en la base de datos, y luego haga una consulta, para recuperarla, pero tambien he visto que tiene sus pro y sus contras.
Esta es la respuesta. Primero necesitamos una tabla con un campo de tipo BLOB donde guardar la imagen:
>>> import sqlite3
>>> conn = sqlite3.connect('/tmp/example')
>>> c = conn.cursor()
>>> c.execute('''create table imagenes (imagen BLOB);''')
Abro una imagen que tengo en disco, mismo directorio que donde ejecute
el intérprete de Python, la cargo en memoria y la guardo en la base.
>>> imgdata = open('tomyNarnia.jpg', 'r').read()
>>> len(imgdata)
1613949
>>> buff = sqlite3.Binary(imgdata)
>>> c.execute('insert into imagenes values(?);', (buff,))
>>> conn.commit()
>>> conn.close()
Luego podemos cerrar el intérprete. Con sqlite3 importado, recuperamos
la imagen.
>>> conn = sqlite3.connect('/tmp/example')
>>> c = conn.cursor()
>>> a = c.execute('select imagen from imagenes')
>>> img = a.fetchone()
>>> len(img)
1
>>> img
(<read-write buffer ptr 0x1c75d60, size 1613949 at 0x1c75d20>,)
El resultado es una tupla, pero como seleccionamos un solo campo de la
tabla, hay un solo elemento.
>>> img = img[0]
>>> len(img)
1613949
Finalmente lo escribimos en una imagen.
>>> f = open('newimage.jpg', 'w')
>>> f.write(img)
>>> f.close()