2010-07-31 11 views
12

Nieświadomy newbie Pythona potrzebuje pomocy. I pomieszania poprzez stworzenie prostego skryptu, który wstawia plik binarny do pola blogu w SQLite database:Pisanie kropli z SQLite do pliku przy użyciu Pythona

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

teraz muszę napisać skrypt, który chwyta zawartość pola blob specyficznego rekordu i zapisuje binarny blob do pliku. W moim przypadku używam bazy danych SQLite do przechowywania dokumentów .odt, więc chcę pobrać i zapisać je jako pliki .odt. Jak mam to załatwić? Dzięki!

+0

Jaki jest błąd, który otrzymujesz? – nosklo

+0

Brak błędu. Chcę tylko dowiedzieć się, jak napisać zawartość pola blob do pliku. – dmpop

Odpowiedz

28

Oto skrypt, który ma odczytać plik, umieścić go w bazie danych, odczytać go z bazy danych, a następnie zapisać go do innego pliku:

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

Testowałem go z XML i PDF i to działało doskonale. Wypróbuj go z plikiem odtworzeń i sprawdź, czy działa.

+0

Dziękujemy! Kod zapisuje obiekt typu blob jako plik, ale plik wydaje się być uszkodzony, tzn. Aplikacja (OpenOffice.org Writer w moim przypadku) odmawia jej otwarcia. Próbowałem zapisać i wyodrębnić zwykły plik txt, ale wyszedł pusty. czy robię coś źle? Dzięki! – dmpop

+0

Uruchom narzędzie do porównywania na oryginalnym pliku i plik zapisany, a następnie załadowany, aby zobaczyć, jakie są różnice. Jeśli możesz opublikować swój schemat bazy danych, być może będę mógł spróbować. –

+0

Dziękuję bardzo za pomoc. Schemat bazy danych jest prosty: jedna tabela zawiera garść pól. \t CREATE_SQL = \ \t \t „Tworzenie notatek tabeli (\ \t \t id INTEGER PRIMARY KEY UNIQUE NOT NULL, \ \t \t uwaga VARCHAR (1024), \ \t \t pliku BLOB \ \t \t tagów VARCHAR (256)); " \t cursor.execute (CREATE_SQL) \t conn.commit() Postaram się uruchomić diff, jak tylko będę miał dostęp do mojej maszyny. Dzięki! – dmpop

Powiązane problemy