如何转储存储在SQLite数据库作为一个blob文件?(How to dump a file sto

2019-07-21 18:03发布

我有一个sqlite3的数据库。 一列具有文本类型,并包含斑点,我想保存为文件。 这些都是gzip压缩文件。

该命令的输出sqlite3 db.sqlite3 ".dump"是:

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

我如何可以提取从源码文件中的二进制数据使用命令行文件?

Answer 1:

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功能 :

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


Answer 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


Answer 3:

就我而言,我使用“十六进制”,而不是“引用”从数据库中检索图像,并没有必要“切断”的命令管道。 例如:

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


文章来源: How to dump a file stored in a sqlite database as a blob?
标签: sqlite blob