Я портирую базу данных 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
). Я также проверил размер объекта, и он имеет примерно одинаковый размер в обоих фрагментах после записи записей.
Что мне здесь не хватает? Почему данные не записываются в таблицу во втором примере?