2015-05-05 7 views
9

Ich bin auf Windows 7 64 Bit. Ich habe eine CSV-Datei 'data.csv'. Ich möchte Daten über ein Python-Skript in eine PostgreSQL-Tabelle 'temp_unicommerce_status' importieren.Kopieren Sie Daten von CSV PostgreSQL mit Python

My Script ist:

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:\Users\n\Desktop\data.csv';""") 
conn.commit() 
conn.close() 

ich diesen Fehler

Traceback (most recent call last): 
    File "C:\Users\n\Documents\NetBeansProjects\Unicommerce_Status_Update\src\unicommerce_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. 

Antwort

15

Verwenden Sie die copy_from cursor method

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

Die Datei muss als Objekt übergeben werden. obwohl

Da Sie es notwendig, aus einer CSV-Datei fertig werden ist das Trennzeichen als Standard festlegen, ist ein Tabulatorzeichen

+0

das nicht funktioniert (und copy_expert) benötigen eine Super User Rolle? Es wird nicht von STDIN gepumpt, wodurch die Super User-Rolle vermieden wird. Das Kopieren von einer Datei erfordert den Benutzer, was so aussieht. Mein Problem ist, dass das ausgeführt wird, aber nichts tut, und ich denke, es gibt einen Superbenutzerfehler, der stillschweigend fehlschlägt. – yekta

+0

Ich kann bestätigen, dass copy_from für eine Instanz von aws rds-postgresql funktioniert, wo Ihnen tatsächlich nur rds_superuser, aber kein Superuser gewährt wird – mork

0

Versuchen Sie, das gleiche wie der Root-Benutzer zu tun, bin immer - Postgres. Wenn es ein Linux-System wäre, könnten Sie die Dateiberechtigungen ändern oder die Datei nach/tmp verschieben. Das Problem resultiert aus fehlenden Anmeldeinformationen zum Lesen aus dem Dateisystem.

1

Hier ist ein Auszug aus der relevanten PostgreSQL-Dokumentation: COPY mit einem Dateinamen weist den PostgreSQL-Server an, direkt von einer Datei zu lesen oder in eine Datei zu schreiben. Die Datei muss für den Server zugänglich sein und der Name muss vom Standpunkt des Servers aus angegeben werden. Wenn STDIN oder STDOUT angegeben ist, Daten über die Verbindung zwischen dem Client übertragen werden, und der Server

Das ist der Grund, warum der copy Befehl oder aus einer Datei in einem PostgreSQL-Superuser einen eingeschränkt: muss die Datei auf dem Server vorhanden sein und wird direkt vom Serverprozess geladen.

Sie sollten stattdessen verwenden:

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

wie this other answer vorgeschlagen, weil es intern COPY von stdin verwendet.

Verwandte Themen