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
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éfautpg_read_server_files
,pg_write_server_files
oupg_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:
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