introduccion - ¿Cómo volcar un archivo almacenado en una base de datos sqlite como un blob?
procedure sqlite (2)
Tengo una base de datos sqlite3. Una columna tiene el tipo de texto y contiene blobs que me gustaría guardar como archivo. Esos son archivos gzip.
La salida del comando sqlite3 db.sqlite3 ".dump"
es:
INSERT INTO "data" VALUES(1,''objects'',''object0.gz'',X''1F8B080000000000000 [.. a few thousands of hexadecimal characters ..] F3F5EF'')
¿Cómo puedo extraer los datos binarios del archivo sqlite a un archivo usando la línea de comando?
sqlite3
no puede generar datos binarios directamente, por lo que debe convertir los datos en un hexdump, usar cut
para extraer los dígitos hexadecimales del blob literal y usar xxd
(parte del paquete vim
) para convertir el hexdump en binario:
sqlite3 my.db "SELECT quote(MyBlob) FROM MyTable WHERE id = 1;" /
| cut -d/' -f2 /
| xxd -r -p /
> object0.gz
Con SQLite 3.8.6 o posterior, el shell de línea de comandos incluye la extensión de fileio
, que implementa la función de writefile
:
sqlite3 my.db "SELECT writefile(''object0.gz'', MyBlob) FROM MyTable WHERE id = 1"
Tuve que hacer algunos cambios menores en la respuesta de CL para hacer que funcionase para mí:
La estructura del comando que está utilizando no tiene el nombre de la base de datos, la sintaxis que estoy usando es algo así como:
sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = ''1'';" | ...
La forma en que usa el comando de
cut
no funciona en mi máquina. La forma correcta para mí es:cut -d "''" -f2
Entonces el comando final sería algo así como:
sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = ''1'';" | cut -d "''" -f2 | xxd -r -p > myfile.extension
Y en mi caso:
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