@FaulerAffe
-

Как добавить файл в BLOB на sqlite(python)?

Я где-то прочитал, что в BLOB файлы хранятся просто в hex. Соответственно, я преобразовал нужный мне файл в hex, попытался вставить в BLOB и получил ошибку:
file = open(f'/Users/vladimirkorsunov/Downloads/bot_pdf/{pdf_file_id}.pdf', 'rb')
    bin_file = file.read()
    hex_file = binascii.hexlify(bin_file)
    conn = sqlite3.connect("orders_list.db")
    c = conn.cursor()
    c.execute(f"INSERT INTO orders (student_id, subject, pdf_file, exercises, price) VALUES ({student_id}, '{subject}', {hex_file}, '{exercises}', {price})")
    conn.commit()


Я видел, что кто-то использует hexdump, но я не понял, что там к чему. Вот один из примеров:
(printf "INSERT INTO test(id, name, blob_field) VALUES(NULL, 'Bob', 0x" ; \
 hexdump -v -e '/1 "%02x"' 001.png ; printf ");" ) | sqlite3 my.db

Как я понял из документации, -е задает формат строки, но почему он такой, какой он в примере? Что это вообще значит? В любом случае, на python я примеров вообще не нашел, так что даже попробовать это использовать не могу,
  • Вопрос задан
  • 242 просмотра
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Я, конечно, дилетант в Python, но могу сказать точно, что blob нужен в СУБД, чтобы можно было сохранять бинарное содержимое файла как есть.
То есть подключались к файлу в бинарном режиме. Потом читаете поток файла как есть, без этого преобразования:
hex_file = binascii.hexlify(bin_file)
А сразу использовать bin_file как входной параметр запроса.
Кроме того, можно обнаружить, что использование bin_file в качестве временного хранения содержимого файла в оперативной памяти phy-сервера - это опять нецелевое использование возможности блоб.
Я специально не буду гуглить phy-функцию, но такая точно есть, которая открывает дисковый файл и тут же привязывает дескриптор файла к параметру запроса (bind), не считывая тело файла. При запуске выполнения запроса, файл самостоятельно средствами среды отправляется в базу, не нагружая серьезно оперативную память.
Такую же функцию можно найти для выборки данных сразу в файл.
Это позволяет ворочить гигабайтовыми файлами, используя считанные мегабайты оперативной памяти сервера, при выполнении phy-скриптов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы