Строковый буфер не может записать данные в таблицу базы данных
Я портирую базу данных 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()