Możesz zrobić coś znacznie prostszego, co również będzie znacznie szybsze. Pamiętaj, że to podejście działa tylko wtedy, gdy możesz przechowywać całą zawartość pliku w ciągłej pamięci, a obecny twardy limit wynosi 1 GB, nawet jeśli masz dostępnych wiele terabajtów pamięci RAM!
cursor.execute("insert into t (id, b) values (:my_id, :my_blob)",
(1, mem_file.getvalue())
Wstawianie wartości empty_blob() i zwracanie lokalizatora LOB do późniejszej aktualizacji jest szybsze niż tworzenie tymczasowego LOB i wstawianie go (tak jak robisz to w kodzie), ale bezpośrednie wstawianie danych jest jeszcze szybsze!