web-dev-qa-db-ja.com

sqliteデータベースに保存されているファイルをblobとしてダンプする方法は?

私はsqlite3データベースを持っています。 1つの列にはTEXTタイプがあり、ファイルとして保存するblobが含まれています。これらはgzip圧縮されたファイルです。

コマンド_sqlite3 db.sqlite3 ".dump"_の出力は次のとおりです。

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

コマンドラインを使用して、sqliteファイルからファイルにバイナリデータを抽出するにはどうすればよいですか?

33
alecail

sqlite3はバイナリデータを直接出力できないため、データをhexdumpに変換し、cutを使用してblobリテラルから16進数を抽出し、xxdvimパッケージの一部)を使用して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"
59
CL.

[〜#〜] 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
3
Canella

私の場合、「引用」ではなく「16進数」を使用してデータベースから画像を取得しているため、コマンドパイプで「カット」する必要はありません。例えば:

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