私は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ファイルからファイルにバイナリデータを抽出するにはどうすればよいですか?
sqlite3
はバイナリデータを直接出力できないため、データをhexdumpに変換し、cut
を使用してblobリテラルから16進数を抽出し、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"
[〜#〜] 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
私の場合、「引用」ではなく「16進数」を使用してデータベースから画像を取得しているため、コマンドパイプで「カット」する必要はありません。例えば:
sqlite3 fr.db "select hex(bmp) from reg where id=1" | xxd -r -p > 2.png