Копирование данных csv, полученных с использованием .read () в базу данных postgresql с использованием Python 3.5

Mantis спросил: 13 июня 2018 в 11:34 в: python

Я хочу скопировать данные csv без загрузки фактического CSV в мою папку. В настоящее время я могу получить данные csv через следующий код:

f = request.files['data_file'].read()
    a = f.decode('utf-8')

Если бы я напечатал a, я могу получить данные из csv. Моя проблема заключается в том, как скопировать эти данные в мою базу данных postgresql? Я попытался использовать команду copy в postgresql, но ему нужен путь к файлу, и я не хочу хранить фактический csv. Я просто хочу, чтобы он был скопирован непосредственно в моей базе данных postgres. Im использует python 3.

1 ответ

bimsapi ответил: 16 июня 2018 в 12:22

Использование одного из методов psycopg2.copy_* - это путь. Какой из них будет зависеть от -

  • Имеет ли csv заголовок?
  • Соответствует ли структура csv таблице точно (число и тип столбцы)?

Примечание # 1 - Форма команды копирования, которая принимает путь, ожидает, что этот путь существует на сервере базы данных . В Героку этого никогда не будет. Вместо этого вам нужна форма команды: copy table_name from stdin.... Метод copy_from - это удобный метод для этой формы.

1) Простейший файл с разделителями-запятыми без заголовков, которые точно соответствуют структуре таблицы:

stmt.copy_from(request.files['data_file'], 'your_table', sep=',')

(stmt) - это курсор, предпочтительно используемый внутри предложения with conn.cursor() as stmt:)

2) Нет заголовка, но csv имеет только подмножество столбцы:

stmt.copy_from(request.files['data_file'], 'some_table', sep=',', cols=['col1', 'col2', 'col3'])

3) Если у вас есть заголовок, вам понадобится copy_expert -

sql = """
    copy some_table (col1, col2, col3)
    from stdin with csv header delimiter ','
"""
stmt.copy_expert(sql, request.files['data_file'])

Примечание №2 - данные будут неявно преобразованы в правильный тип. Он также должен будет удовлетворять ограничениям данных. Неисполнение одной операции для одной записи убивает всю транзакцию. В результате вам может понадобиться получить фантазию и загрузить все данные в простую временную таблицу, очистить ее, затем сделать select into (

Примечание № 3 - я как бы догадался, что вы можете использовать request.files напрямую, но не тестировали его. Если это не удается, поместите данные в файл temp и используйте это как аргумент метода копирования.

Смотрите:

  • http://initd.org/psycopg/docs/cursor.html#cursor.copy_from

Дополнительное видео по вопросу: Копирование данных csv, полученных с использованием .read () в базу данных postgresql с использованием Python 3.5

Python tutorial - 17 - Psycopg2 Insert,Update,Delete,Query Postgres Database

30.Python для Начинающих - Работа с Базами Данных SQL Server

018. Базы данных: PostgreSQL - Владимир Бородин