копирование данных из csv в postgresql с помощью python

Я на windows 7 64 бит. У меня есть данные csv-файла.КШМ'. Я хочу импортировать данные в таблицу postgresql 'temp_unicommerce_status' через скрипт python.

мой скрипт:

import psycopg2
conn = psycopg2.connect("host='localhost' port='5432' dbname='Ekodev' user='bn_openerp' password='fa05844d'")
cur = conn.cursor()
cur.execute("""truncate table "meta".temp_unicommerce_status;""")
cur.execute("""Copy temp_unicommerce_status from 'C:UsersnDesktopdata.csv';""")
conn.commit()
conn.close()

Я получаю эту ошибку

Traceback (most recent call last):
  File "C:UsersnDocumentsNetBeansProjectsUnicommerce_Status_Updatesrcunicommerce_status_update.py", line 5, in <module>
cur.execute("""Copy temp_unicommerce_status from     'C:UsersnDesktopdata.csv';""")
psycopg2.ProgrammingError: must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's copy command also works for anyone.

4 ответов


использовать copy_from метод курсор

f = open(r'C:\Users\n\Desktop\data.csv', 'r')
cur.copy_from(f, temp_unicommerce_status, sep=',')
f.close()

файл должен быть передан как объект.

поскольку вы справляетесь с csv-файлом, необходимо указать разделитель, поскольку по умолчанию используется символ вкладки


вот выдержка из соответствующей документации PostgreSQL : копировать с именем файла указывает серверу PostgreSQL непосредственно читать или записывать в файл. Файл должен быть доступен серверу, и имя должно быть указано с точки зрения сервера. Когда указан STDIN или STDOUT, данные передаются через соединение между клиентом и сервером

вот почему copy команда Для или из файла a, ограниченного PostgreSQL superuser: файл должен присутствовать на сервере и загружается непосредственно серверным процессом.

вместо этого вы должны использовать :

cur.copy_from(r'C:\Users\n\Desktop\data.csv', temp_unicommerce_status)

как было предложено этот и другие ответы, потому что внутренне он использует COPY из stdin.


Как я решил эту проблему, в частности, использовать функцию класса курсора psychopg2 copy_expert (Docs:http://initd.org/psycopg/docs/cursor.html). copy_expert позволяет использовать STDIN, поэтому обходя необходимость выдачи привилегии суперпользователя для пользователя postgres. Ваш доступ к файлу зависит от доступа пользователя клиента (linux/windows/mac) к файлу

из Postgres копировать документы (https://www.postgresql.org/docs/current/static/sql-copy.html):

Не путайте COPY с инструкцией psql \copy. \скопировать вызывает Скопируйте из STDIN или скопируйте в STDOUT, а затем извлекает / сохраняет данные в файл, доступный клиенту psql. Таким образом, доступность файлов и права доступа зависят от клиента, а не от сервера при \copy предназначенный.

вы также можете оставить разрешения, установленные строго для доступа к development_user домашняя папка и папка приложения.

sql = "COPY table_name FROM STDIN DELIMITER '|' CSV HEADER"
        self._cursor.copy_expert(sql, open(csv_file_name, "r"))

попробуйте сделать то же самое, что и пользователь root - postgres. Если бы это была система linux, вы могли бы изменить разрешения файла или переместить файл в /tmp. Проблема возникает из-за отсутствия учетных данных для чтения из файловой системы.