L'importation de fichier CSV PostgreSQL provoque une erreur de syntaxe

8

J'essaie d'importer un fichier CSV dans une base de données via la commande "COPY"; cependant, j'obtiens l'erreur (ce qui semble courant) dont j'ai besoin pour être un superutilisateur et que je dois utiliser "\ copy" à la place. Cependant, lorsque j'utilise \ copy, j'obtiens une erreur de syntaxe:

ERROR:  syntax error at or near "\"
LINE 1: \copy

Avec le curseur pointant vers "\". Voici ma requête:

\copy tablename(column2, column3, column4, column5) from '/home/uploads/data.csv' WITH DELIMITER ',' CSV HEADER'

J'ai essayé à la fois "copier" et "\ copier". Le premier me donnant une erreur de superutilisateur le second me donnant cette erreur de syntaxe. Une idée sur la façon de le réparer? fais-le fonctionner?

J'exécute la commande via le champ de saisie sql de myPgAdmin.

La seule autre question que je me pose concerne l'importation des colonnes via tablename (column2, column3 et ainsi de suite. Est-ce la bonne syntaxe pour cela?

antjanus
la source

Réponses:

8

\copyest une commande psql (ligne de commande). Ce n'est pas une commande SQL standard.

Vous devrez utiliser COPY à la place (mais cela nécessite que le fichier soit présent sur le serveur de base de données)

un cheval sans nom
la source
Comment importeriez-vous des fichiers CSV directement via SQL plutôt que d'utiliser une ligne de commande?
antjanus
1
@antjanus: vous utiliseriez la commande COPY comme je l'ai mentionné (et adam expliqué en détail)
a_horse_with_no_name
encore une fois, cela nécessite des autorisations de superutilisateur et n'est pas sûr, non?
antjanus
4

Veuillez vous référer au manuel postgres pour COPY .

Dans pgAdmin (ou la chaîne sql que vous passez via un script ou une autre connexion db), vous utiliseriez simplement COPY sans préfixe "\".

alors entrez quelque chose comme: COPY tablename....

Vous devez vous assurer que vous disposez des privilèges appropriés pour exécuter la commande, dans ce cas, vous devez être en mesure de vous connecter à la base de données et d'avoir un accès en écriture à «nom de table». Postgres doit également pouvoir accéder au fichier, donc le chemin / home / uploads / doit être accessible sur le serveur de base de données et l'utilisateur postgres doit pouvoir lire le fichier - vérifiez les autorisations sur le fichier et le répertoire.

adam f
la source
2

Sur mon système 9.1, l'erreur que j'obtiens est assez informative:

or_examples=> copy comp_table_test from '/tmp/test';
ERROR:  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.

Si vous relisez attentivement le conseil, il indique que vous pouvez copier à partir de stdin. C'est ce que \ copy dans psql fait réellement dans le back-end. Voir les documents sur http://www.postgresql.org/docs/8.3/static/sql-copy.html pour plus d'informations.

Vous pouvez ensuite mettre le corps de la copie dans votre requête ou du moins c'est ainsi que cela fonctionne dans psql.

Chris Travers
la source
1
copy coordina from '/tmp/filename.txt' WITH NULL AS ;

Voilà comment je le fais dans pgAdmin3. Mais vérifiez soigneusement les droits, parfois les droits sont le problème. (postgres utilisateur sur filename.txt / chmod 777)

Martin
la source
vous devez être un superutilisateur db pour ce faire, d'où la plainte d'origine.
Chris Travers
0

Une autre méthode consiste à créer une vue pour la requête SQL. Utilisez ensuite la commande \ copy.

NinjaLoop
la source
2
Une plus grande exposition serait très utile.
Michael Green
Comment une vue aide-t-elle lors de l' importation de données?
a_horse_with_no_name