LINUX.ORG.RU

Умеет ли sqlite3 работать с base64 и zip?

 


0

2

Берётся текстовый файл, упаковывается в ZIP, содержащий ровно 1 файл, кодируется в base64, и полученный текст кладётся в базу sqlite. Требуется узнать имя и размер упакованного файла. В Sqlite такие средства предусмотрены?

Для определённости приведу скрипты на Питоне, которыми извлекаю информацию.
Сохранение всех архивов на диск для просмотра вручную:

import sqlite3, base64, zipfile, io
con = sqlite3.connect( '. . .' )
for n, body in con.execute('SELECT Id, Text FROM Table_C'):
    open( f'. . ./{n:03}.zip', 'wb').write(base64.b64decode(body))

Вывод ID, имени и размера упакованного файла.

import sqlite3, base64, zipfile, io
con = sqlite3.connect( '. . .' )
for id, body in con.execute('SELECT Id, Text FROM Table_C'):
	for e in zipfile.ZipFile(io.BytesIO(base64.b64decode(body))).infolist():
		print(id, e.filename, e.file_size)

А можно ли так сделать средствами официального CLI-клиента?

★★★

Последнее исправление: olegd (всего исправлений: 1)

Вы можете при помещении файла в базу добавлять информацию о имени и размере файла.

Для этого базы данных и придуманы.

anonymous
()

Нет, sqlite так не умеет. Реализуйте эту логику в приложении, которое работает с БД. Если нужно иметь возможность делать выборки по этим параметрам, то добавьте колонки хранящие имя и размер файла, заполняемые всеми функциями вставки и обновления записей.

KivApple ★★★★★
()

Зачем тебе эта дичь?

1) не надо никаких base64

2) используй gzip а не zip

3) имя и размер храни в базе напрямую

4) много раз подумай перед тем как хранить в базе файлы - всякое конечно бывает, но обычно это ошибочное решение и файлы лучше хранить файлами

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Зачем тебе эта дичь?

Автор архитектуры не я.

Файлы мелкие, 0,1-3К, с версионированием. В дальнейшем Sqlite заменят на что-то поэнтерпрайзнее. По опыту, организовать общую БД легче, чем общую файловую шару.

olegd ★★★
() автор топика
Ответ на: комментарий от olegd

Это по 4 пункту, хорошо, такое и правда в бд сойдёт, но остальные 3 пункта в силе.

firkax ★★★★★
()

зачем base64 ?? тип колонки BLOB и до 1тб raw файла можно впихнуть в одну ячейку.
так к примеру хранятся тайлики (картинки jpg png и т.д.) растровой карты формата mbtiles. да и не только.

ковырял когда-то, но так через официальный клиент и не получилось напрямую выводить содержимое ячейки.

по 4 пункту firkax: вот тайлики огромных количеств удобнее хранить в бд с индексами, чем в виде кучи мелких файлов.
ибо их количества зашкаливают за несколько сотен тысяч штук. а так как индекс имен в дире есть сильно не везде (в какойто фс помнится видел) чтение списка директории начинает очень сильно тормозить :)
ну и при копировании начинается длительное насилие над носителями.
каждый инструмент удобен когда он удобен.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 4)
Ответ на: комментарий от firkax

хранить в базе файлы - всякое конечно бывает, но обычно это ошибочное решение и файлы лучше хранить файлами

Если под файлы – отдельная таблица (id, blob) то почему бы и нет: лежит, никому не мешает (в смысле при запросах по другим таблицам файлы в память не поднимаются), а транзакционность (если это важно) при добавлении/удалении файлов обеспечивает. Видал я системы где файлы отдельно от базы: везде помойка рассогласованная. Хотя конечно от файлов зависит: если там что-то огромное (видео, etc.) то запаришься (и сам, и несчастный SQL-сервер, и ещё более несчастные диски).

dimgel ★★★★★
()
Последнее исправление: dimgel (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.