web-dev-qa-db-fra.com

Dans PostgreSQL, comment insérer des données avec la commande COPY?

J'ai un problème lors de l'exécution de 1 projet NodeJs avec la base de données PostgreSQL. J'ai une erreur lors de la tentative d'insertion de données dans pgAdmin à l'aide de la commande COPY.

COPY beer (name, tags, alcohol, brewery, id, brewery_id, image) FROM stdin;

Bons Voeux  blonde  9.5 Brasserie Dupont    250 130 generic.png

Ces données dans Gist :

Cette erreur:

ERROR: syntax error at or near "Bons"
SQL state: 42601
Character: 1967

I was create database like this and execute file .sql:

20
user4646310
COPY tbl FROM STDIN;

n'est pas pris en charge par pgAdmin.
Vous obtenez une erreur de syntaxe simple car Postgres obtient les données sous forme de code SQL.

Quatre solutions possibles:

1. Utilisez plutôt un INSERT à plusieurs lignes:

INSERT INTO beer(name, tags, alcohol, brewery, id, brewery_id, image)
VALUES 
  ('Bons Voeux', 'blonde', 9.5, 'Brasserie Dupont', 250, 130, 'generic.png')
, ('Boerke Blond', 'blonde', 6.8, 'Brouwerij Angerik', 233, 287 'generic.png')
;

Notez la syntaxe différente (SQL) pour les valeurs sous forme de chaînes ou de littéraux numériques.

Vous pouvez générer les données avec pg_dump En utilisant --inserts . En relation:

2. Ou appelez votre script sur la ligne de commande en utilisant psql. En tant qu'utilisateur système postgres:

psql -f beer.sql -U my_login_role -d db_name 

La base de données (-d) Et le rôle de connexion (-U Pour "Utilisateur") peuvent être omis si les valeurs par défaut sont correctes. Exemples de syntaxe:

Assurez-vous qu'il existe un marqueur de fin de données (\.) Pour le format par défaut text. (Vous l'avez.) Le manuel:

La fin des données peut être représentée par une seule ligne contenant uniquement une période de barre oblique inverse (\.). Un marqueur de fin de données n'est pas nécessaire lors de la lecture à partir d'un fichier, car la fin de fichier sert parfaitement bien; il n'est nécessaire que lors de la copie de données vers ou depuis des applications clientes à l'aide du protocole client pré-3.0.

3. Ou déplacez vos données vers un fichier séparé sur le serveur, dites 'beer_data.csv' et utilisez COPY .. FROM 'filename' dans votre script:

COPY beer (name, tags, alcohol, brewery, id, brewery_id, image)
FROM '/path/to/beer_data.csv';

Qui fonctionne de toute façon. Vous avez cependant besoin de privilèges de superutilisateur. Le manuel:

[...] COPY le fait de nommer un fichier ou une commande n'est autorisé qu'aux superutilisateurs de base de données ou aux utilisateurs qui se voient attribuer l'un des rôles par défaut pg_read_server_files, pg_write_server_files ou pg_execute_server_program, Car il permet de lire ou d'écrire n'importe quel fichier ou d'exécuter un programme auquel le serveur a des privilèges d'accès.

(pg_read_server_files, pg_write_server_files Et pg_execute_server_program Sont nouveaux dans Postgres 11.)

4. Ou lisez un fichier local sur le client avec la psql méta-commande \copy . Voir:

29
Erwin Brandstetter

Premier pas:

créer une base de données belgianbeers sur pgAdmin.

Deuxième étape: Ouvrez l'invite et exécutez cette ligne de commande:

psql -U postgres -d belgianbeers -a -f beers.sql

Cette ligne de commande exécutant les tables de base de données e update.

-U = nom d'utilisateur postgres

4
Claudio