копирование данных из csv в postgresql с помощью python
Я нахожусь на windows 7 64 бит. У меня есть данные csv-файла.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:\Users\n\Desktop\data.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: COPY with a file name инструктирует сервер PostgreSQL для прямого чтения или записи в файл. Файл должен быть доступен для сервера, и имя должно быть указано с точки зрения сервера. Когда указан STDIN или STDOUT, данные передаются через соединение между клиентом и сервером
Вот почему команда
copy
Для или из файла a ограничена суперпользователем PostgreSQL : файл должен присутствовать на сервере и загружается непосредственно серверным процессом.Вместо этого следует использовать :
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 COPY Docs (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"))