2010-07-31 35 views
12

Un novato de Python despistado necesita ayuda. Me confusa a través de la creación de un script sencillo que inserta un archivo binario en un campo de blog en una base de datos SQLite:Escribiendo blob de SQLite a archivo usando Python

import sqlite3 
conn = sqlite3.connect('database.db') 
cursor = conn.cursor() 
input_note = raw_input(_(u'Note: ')) 
    input_type = 'A' 
    input_file = raw_input(_(u'Enter path to file: ')) 
     with open(input_file, 'rb') as f: 
      ablob = f.read() 
      f.close() 
     cursor.execute("INSERT INTO notes (note, file) VALUES('"+input_note+"', ?)", [buffer(ablob)]) 
     conn.commit() 
    conn.close() 

ahora tengo que escribir un script que agarra los contenidos del campo de burbuja de un registro específico y escribe el blob binario a un archivo. En mi caso, utilizo la base de datos SQLite para almacenar documentos .odt, así que quiero tomarlos y guardarlos como archivos .odt. ¿Cómo hago eso? ¡Gracias!

+0

¿Cuál es el error que está obteniendo? – nosklo

+0

Ningún error. Solo quiero descubrir cómo escribir un contenido de un campo blob en un archivo. – dmpop

Respuesta

28

Aquí hay un script que hace leer un archivo, lo puso en la base de datos, leyó la base de datos y luego escribir en otro archivo:

import sqlite3 
conn = sqlite3.connect('database.db') 
cursor = conn.cursor() 

with open("...", "rb") as input_file: 
    ablob = input_file.read() 
    cursor.execute("INSERT INTO notes (id, file) VALUES(0, ?)", [sqlite3.Binary(ablob)]) 
    conn.commit() 

with open("Output.bin", "wb") as output_file: 
    cursor.execute("SELECT file FROM notes WHERE id = 0") 
    ablob = cursor.fetchone() 
    output_file.write(ablob[0]) 

cursor.close() 
conn.close() 

lo probé con un xml y un pdf y funcionó perfectamente. Pruébalo con tu odt y mira si funciona.

+0

¡Gracias! El código guarda el blob como un archivo, pero el archivo parece estar dañado, es decir, la aplicación (OpenOffice.org Writer en mi caso) se niega a abrirlo. Traté de guardar y extraer un archivo .txt simple, pero salió vacío. ¿Estoy haciendo algo mal? ¡Gracias! – dmpop

+0

Ejecute una herramienta diff en el archivo original y la guardada y cargada para ver cuáles son las diferencias. Si puede publicar su esquema db, podría intentarlo. –

+0

Muchas gracias por ayudarme. El esquema de la base de datos es simple: una tabla un puñado de campos. \t CREATE_SQL = \ \t \t "Crear notas del cuadro (\ \t \t ID INTEGER PRIMARY clave exclusiva no NULL, \ \t \t nota VARCHAR (1024), \ \t \t archivo BLOB, \ \t \t etiquetas VARCHAR (256)); " \t cursor.execute (CREATE_SQL) \t conn.commit() Voy a tratar de ejecutar diff tan pronto como tenga acceso a mi máquina. ¡Gracias! – dmpop

Cuestiones relacionadas