Как сбрасывать файл, хранящийся в базе данных sqlite, в виде капли?
У меня есть база данных sqlite3. Один столбец имеет тип TEXT и содержит капли, которые я хотел бы сохранить как файл. Это файлы gzipped.
Вывод команды sqlite3 db.sqlite3 ".dump"
:
INSERT INTO "data" VALUES(1,'objects','object0.gz',X'1F8B080000000000000 [.. a few thousands of hexadecimal characters ..] F3F5EF')
Как я могу извлечь двоичные данные из файла sqlite в файл с помощью командной строки?
Ответы
Ответ 1
sqlite3
не может напрямую выводить двоичные данные, поэтому вам нужно преобразовать данные в hexdump, используйте cut
для извлечения шестнадцатеричных цифр из литерала blob и используйте 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"
Ответ 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