Строковый буфер не может записать данные в таблицу базы данных

Я портирую базу данных Mongo на PostgreSQL, и я столкнулся с проблемой. я использую psycopg2"s COPY_FROM, который принимает в качестве аргументов объект файла, таблицу для записи и другие необязательные аргументы. Мой оригинальный код выглядел следующим образом:

records = '\n'.join(','.join([row['id'], row['att1'], row['att3']]) for row in data)
fio = io.StringIO(records)
cursor.copy_from(fio, 'mytable', sep=',')
postgres.commit()

Приведенный выше код работает нормально, но не работает для столбцов, содержащих запятые (разделяются запятыми). Таким образом, я хочу избежать всех запятых и других знаков препинания, которые могут помешать. Для этого я использовал Python csv модуль, который обрабатывает это и получил следующий код:

fio = io.StringIO()
writer = csv.writer(fio)
writer.writerows([row['id'], row['att1'], row['att3']]) for row in data)
cursor.copy_from(fio, 'mytable', sep=',')
postgres.commit()

Используя код выше, mytable остается пустым, несмотря ни на что. Я пробовал итерацию fio после написания строк и содержание такое же, как в исходном фрагменте кода (используя ','.join). Я также проверил размер объекта, и он имеет примерно одинаковый размер в обоих фрагментах после записи записей.

Что мне здесь не хватает? Почему данные не записываются в таблицу во втором примере?

1 ответ

Решение

После написания fio вы в конце файла. Вам нужно вернуться к началу, когда он будет прочитан psycopg2.

Легкая модификация, вот так:

fio = io.StringIO()
writer = csv.writer(fio)
writer.writerows([row['id'], row['att1'], row['att3']]) for row in data)

fio.seek(0) # Return to beginning of file.

cursor.copy_from(fio, 'mytable', sep=',')
postgres.commit()
Другие вопросы по тегам