40

私は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ファイルからファイルにバイナリデータを抽出するにはどうすればよいですか?

4

4 に答える 4

70

sqlite3バイナリデータを直接出力できないため、データを16進ダンプに変換し、を使用cutしてblobリテラルから16進数を抽出し、xxd(パッケージの一部vim)を使用して16進ダンプをバイナリに戻す必要があります。

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"
于 2013-03-16T15:41:32.800 に答える
6

私の場合、データベースから画像を取得するために「quote」の代わりに「hex」を使用し、コマンドパイプで「cut」する必要はありません。例えば:

sqlite3 fr.db "select hex(bmp) from reg where id=1" | xxd -r -p > 2.png
于 2018-03-09T03:24:54.203 に答える
6

コマンドラインツールを使用するwritefile場合に使用できます。sqlite3

使用例: select writefile('blob.bin', blob_column) from table where key='12345';

于 2020-06-05T19:25:06.227 に答える
3

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
于 2014-06-04T19:23:34.673 に答える