Подтвердить что ты не робот

Как сбрасывать файл, хранящийся в базе данных 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 в файл с помощью командной строки?

4b9b3361

Ответ 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