Я использую 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 ()?