Массовая вставка с использованием PostgreSQL copy_from, psycopg2 и StringIO - PullRequest
0 голосов
/ 15 марта 2019

Мне нужно вставить несколько строк в таблицу Postgres из скрипта Python, и я использую совет использовать copy_from для повышения производительности.

import io
data_io = io.StringIO()

# here I have a loop which is omitted for simplicity
data_io.write("""%s\t%s\n""" % (115, 500))

DB = sql.DB()
DB._db_cur.copy_from(data_io, "temp_prices", columns=('id', 'price'))

В моем коде я использую несколько циклов для заполнения 'данными'со значениями, приведенный выше пример.

Но таблица' temp_prices 'пуста и не было выдано никаких ошибок

Я знаю, что мне нужны данные, записанные в data_io, потому что я могу их видетьпри использовании:

print (data_io.getvalue())

Что я делаю не так?

1 Ответ

1 голос
/ 15 марта 2019

Вы не пытались вернуться к началу.Для чтения и записи в файлах используется указатель позиции файла , который перемещается каждый раз, когда вы записываете в файл или читаете из него.Прямо сейчас указатель находится в конце файлового объекта, поэтому чтение ничего не вернет:

>>> import io
>>> data_io = io.StringIO()
>>> data_io.write("""%s\t%s\n""" % (115, 500))
8
>>> data_io.read()
''

Используйте data_io.seek(0), чтобы вернуть позицию файла в начало, прежде чем попросить copy_from прочитатьваши данные:

>>> data_io.seek(0)
0
>>> data_io.read()
'115\t500\n'

С другой стороны: я бы использовал модуль csv для записи данных, разделенных табуляцией, в файл:

import csv

writer = csv.writer(data_io, delimiter='\t')
writer.writerow((115, 500))
...