Строковый буфер не может записать данные в таблицу базы данных - PullRequest
1 голос
/ 31 мая 2019

Я портирую базу данных Mongo на PostgreSQL, и у меня возникла проблема. Я использую psycopg2 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 Ответ

1 голос
/ 31 мая 2019

После записи в 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()
...