2013-03-16 9 views
25

Mam bazę danych sqlite3. Jedna kolumna ma typ TEXT i zawiera obiekty typu blob, które chciałbym zapisać jako plik. Są to spakowane pliki gzip.Jak zrzucić plik zapisany w bazie danych SQLite jako obiekt typu blob?

Wyjście polecenia sqlite3 db.sqlite3 ".dump" jest:

INSERT INTO "data" VALUES(1,'objects','object0.gz',X'1F8B080000000000000 [.. a few thousands of hexadecimal characters ..] F3F5EF')

Jak można wyodrębnić dane binarne z pliku sqlite do pliku przy użyciu wiersza polecenia?

+0

Jaki rodzaj wiersza poleceń? –

+0

Mam na myśli, uruchamiając sqlite3 w terminalu. – alecail

Odpowiedz

47

sqlite3 nie mogą wyjście danych binarnych bezpośrednio, więc trzeba konwertować dane do heksowego użyć cut wyodrębnić cyfr hex z kropelka dosłownym i używać xxd (część pakietu vim) w celu przekształcenia hexdump powrotem Binary

sqlite3 my.db "SELECT quote(MyBlob) FROM MyTable WHERE id = 1;" \ 
| cut -d\' -f2             \ 
| xxd -r -p              \ 
> object0.gz 

z SQLite 3.8.6 lub późniejszej powłoki polecenia linia zawiera przedłużenie fileio, który implementuje writefile function:

sqlite3 my.db "SELECT writefile('object0.gz', MyBlob) FROM MyTable WHERE id = 1" 
+1

wyciąć -d \ '-f2 wykonuje to samo zadanie i jest nieco łatwiejsze do wpisania niż powyższe polecenie sed. – MagerValp

+0

Rzeczywiście; dzięki! –

2

musiałem zrobić kilka drobnych zmian na odpowiedź CL „s, aby zrobić to praca dla mnie:

  • konstrukcji dla komendy, że używa nie posiada nazwę bazy danych w nim, składnia, że ​​używam jest coś takiego:

    sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | ... 
    
  • sposób, w jaki używa komendy cut nie działa w moim komputerze. Prawidłowy sposób dla mnie jest:

    cut -d "'" -f2 
    

więc ostateczna komenda byłoby coś jak:

sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | cut -d "'" -f2 | xxd -r -p > myfile.extension 

A w moim przypadku:

sqlite3 osm-carto_z14_m8_m.mbtiles "select quote(images.tile_data) from images where images.tile_id = '1';" | cut -d "'" -f2 | xxd -r -p > image.png 
+0

BTW, w moim przypadku 'xxd' może poradzić sobie z hexdump zarówno z cytatami lub bez cudzysłowów –

0

W moim przypadku, użyj "hex" zamiast "quote", aby pobrać obraz z bazy danych, i nie trzeba "ciąć" w linii poleceń. Na przykład:

sqlite3 fr.db "select hex(bmp) from reg where id=1" | xxd -r -p > 2.png 
Powiązane problemy