2013-03-16 127 views
25

我有一個sqlite3數據庫。一列有TEXT類型,並且包含我想要保存爲文件的blob。這些是gzip文件。如何將存儲在sqlite數據庫中的文件轉儲爲blob?

命令sqlite3 db.sqlite3 ".dump"的輸出是:

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

如何可以我從源碼文件中的二進制數據中提取到使用命令行文件?

+0

什麼樣的命令行? – 2013-03-16 13:56:45

+0

我的意思是在終端中運行sqlite3。 – alecail 2013-03-16 14:04:30

回答

47

sqlite3不能輸出的二進制數據直接,所以得將數據轉換成一個hexdump都使用cut提取從團塊字面的十六進制數字,並使用xxd(該vim包的一部分)到hexdump都轉換回二進制:

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

使用SQLite 3.8.6或更高版本,命令行殼包括fileio延伸,它實現了writefile function

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

cut -d'-f2完成相同的任務,比上面的sed語句更容易輸入。 – MagerValp 2013-11-20 12:49:05

+0

確實;謝謝! – 2013-11-20 14:52:56

2

我不得不做出對CL的回答一些小的改動,以使其爲我工作:

  • 的,他是用它不具有數據庫名稱的命令結構,我使用的語法是一樣的東西:

    sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | ... 
    
  • 他使用cut命令在我的機器不能正常工作的方式。對我來說,正確的方法是:

    cut -d "'" -f2 
    

所以最終命令是這樣的:

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

而且在我的情況:

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

順便說一句,在我的情況'xxd'可以處理與引號或不帶引號的hexdump – 2016-10-17 18:57:16

0

在我的情況,我使用「hex」而不是「quote」從數據庫檢索圖像,並且不需要在命令管道中「剪切」。例如:

sqlite3 fr.db "select hex(bmp) from reg where id=1" | xxd -r -p > 2.png 
相關問題