2010-07-31 16 views
12

Un newbie python désemparé a besoin d'aide. J'embrouillé en créant un script simple qui insère un fichier binaire dans un champ de blog dans une base de données SQLite:Ecriture de blob à partir de SQLite vers un fichier en utilisant 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() 

Maintenant je dois écrire un script qui récupère le contenu du champ blob d'un enregistrement spécifique et écrit le blob binaire dans un fichier. Dans mon cas, j'utilise la base de données SQLite pour stocker des documents .odt, donc je veux les récupérer et les enregistrer en tant que fichiers .odt. Comment puis-je m'y prendre? Merci!

+0

Quelle est l'erreur que vous obtenez? – nosklo

+0

Aucune erreur. Je veux juste comprendre comment écrire un contenu d'un champ de blob dans un fichier. – dmpop

Répondre

28

est ici un script qui ne lit un fichier, le mettre dans la base de données, lire la base de données, puis l'écrire dans un autre fichier:

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

Je l'ai testé avec un xml et un pdf et cela a fonctionné à la perfection. Essayez-le avec votre fichier odt et voyez si cela fonctionne.

+0

Merci! Le code enregistre le blob sous forme de fichier, mais le fichier semble être endommagé, c'est-à-dire que l'application (OpenOffice.org Writer dans mon cas) refuse de l'ouvrir. J'ai essayé d'enregistrer et d'extraire un fichier .txt simple, mais il est sorti vide. Est-ce que je fais quelque chose de mal? Merci! – dmpop

+0

Exécutez un outil de diff sur le fichier d'origine et le fichier enregistré-et-puis-chargé pour voir quelles sont les différences. Si vous pouvez poster votre schéma db, je pourrais être en mesure d'essayer. –

+0

Merci beaucoup de m'avoir aidé. Le schéma de base de données est simple: une table une poignée de champs. \t CREATE_SQL = \ \t \t « Créer des notes TABLE (\ \t \t id INTEGER PRIMARY KEY UNIQUE NOT NULL, \ \t \t note VARCHAR (1024), \ \t \t blob fichier, \ \t \t balises VARCHAR (256)); " \t cursor.execute (CREATE_SQL) \t conn.commit() Je vais essayer d'exécuter diff dès que j'aurai accès à ma machine. Merci! – dmpop