загрузка io.StringIO / io.BytesIO в postgres как Bytea с помощью psycopg2 - PullRequest
0 голосов
/ 13 июля 2020

Я использую Streamlit, где одна функция - загрузить файл .csv. Загрузчик возвращает объект io.StringIO или io.BytesIO.

Мне нужно загрузить этот объект в мою postgres базу данных. Там у меня есть столбец, содержащий массив байтов:

    CREATE TABLE files (
     id int4 NOT NULL,
     docs_array bytea[] NOT NULL
    ...
    )
;

Обычно я бы использовал запрос SQL, например

UPDATE files SET docs_array = array_append(docs_array, pg_read_binary_file('/Users/XXX//Testdata/test.csv')::bytea) WHERE id = '1';

, однако, поскольку у меня есть объект stringIO, это не работает. Я пробовал

sql = UPDATE files SET docs_array = array_append(docs_array, %s::bytea) WHERE id = '%s';
cursor.execute(sql, (file, testID,) )

и cursor.execute(sql, (psycopg.Binary(file), testID,) ), но всегда получаю одну из следующих ошибок:

не могу адаптировать тип '_io.BytesIO

невозможно преобразовать _io.BytesIO в двоичный

невозможно адаптировать тип '_io.StringIO

не может escape _io.StringIO в двоичный

Как я могу загрузить объект?

ОБНОВЛЕНИЕ:

* спасибо Майку Органеку за предложение!

пример file.read () выглядит как b'"Datum/Uhrzeit","Durchschnittsverbrauch Strom (kWh/100km)","Durchschnittsverbrauch Verbrenner (l/100km)","Fahrstrecke (km)","Fahrzeit (h)","Durchschnittsgeschwindigkeit (km/h)"\r\n"2015-11-28T11:44:06Z","7,6","8,5","1.792","14:01","128"\r\n"2015-11-28T12:28:45Z","7,7","8,5","1.473","14:21","103"\r\n"2015-12-24T06:04:43Z","5,5","8,3","4.848","48:01","101"\r\n"2015-12-24T12:15:25Z","27,2","8,0","290","3:20","88"\r\n'

, но если я попытаюсь выполнить

cursor.execute(sql, (file.read(), testID,) )

, в базу данных загружается только "\ x". Все данные потеряны по какой-либо причине Снимок экрана

Тем не менее, если я определю файл как b '"Datum / Uhrzeit", "Durchschnittsverbrauch Strom (кВтч / 100 км)" ... "8 , 5 "\ r \ n '- все работает. Итак, я предполагаю, что проблема где-то в объекте io и .read ()?

1 Ответ

0 голосов
/ 13 июля 2020

Майк Органек указал на решение:

file.read() в cursor.execute(sql, (file.read(), testID,)), чтобы получить двоичные данные, в то время как не чтение файла ранее помогло.

...