Как вставить BLOB в Oracle с помощью Python? - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь вставить много больших двоичных объектов (от 2 до 20 МБ каждый) в Oracle 12 с помощью cx_Oracle 6.3.

После долгих поисков и поисков я получил следующий код.Я новичок в Python и хотел бы знать: действителен ли подход?Есть ли более быстрый способ?

#!/usr/local/bin/python3
import io
import os
import cx_Oracle

pdf = open('hello.pdf', 'rb')
mem_file = io.BytesIO(pdf.read())
mem_file.seek(0, os.SEEK_END)
file_size = mem_file.tell()

con = cx_Oracle.connect("user", "***", "localhost:1512/ORCLPDB1", encoding="UTF-8")

# create table for this example
con.cursor().execute("CREATE TABLE t (id NUMBER, b BLOB) LOB(b) STORE AS SECUREFILE(COMPRESS)");

# prepare cursor
cursor = con.cursor()
my_blob = cursor.var(cx_Oracle.BLOB, file_size)
my_blob.setvalue(0, mem_file.getvalue())

# execute insert
cursor.execute("INSERT INTO t(id, b) VALUES (:my_id, :my_blob)", (1, my_blob))
con.commit()

con.close()

Как насчет вставки EMPTY_BLOB() и выполнения UPDATE позже?Нужно ли / полезно ли вычислять размер BLOB до вставки?

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете сделать что-то гораздо более простое, что также будет значительно быстрее.Обратите внимание, что этот подход работает только тогда, когда вы можете хранить все содержимое файла в непрерывной памяти и текущий жесткий лимит составляет 1 ГБ, даже если у вас много терабайт доступной оперативной памяти!

cursor.execute("insert into t (id, b) values (:my_id, :my_blob)",
        (1, mem_file.getvalue())

Вставка пустого_блока() и возврат локатора больших объектов для последующего обновления быстрее, чем создание временного большого объекта и его вставка (как вы делаете в своем коде), но прямая вставка данных еще быстрее!

...