Postgres: \copie d'erreur de syntaxe .fichier sql
Je suis en train d'écrire un script qui copie les données d'une requête analyse croisée à une .fichier csv dans Postgresql 8.4. Je suis en mesure d'exécuter la commande dans la ligne de commande psql mais quand j'ai mis la commande dans un fichier et de l'exécuter à l'aide de la -f
option, j'obtiens une erreur de syntaxe.
Voici un exemple de ce que je suis à la recherche d' (à partir de cette grande réponse):
CREATE TEMP TABLE t (
section text
,status text
,ct integer
);
INSERT INTO t VALUES
('A', 'Active', 1), ('A', 'Inactive', 2)
,('B', 'Active', 4), ('B', 'Inactive', 5)
, ('C', 'Inactive', 7);
\copy (
SELECT * FROM crosstab(
'SELECT section, status, ct
FROM t
ORDER BY 1,2'
,$$VALUES ('Active'::text), ('Inactive')$$)
AS ct ("Section" text, "Active" int, "Inactive" int)
) TO 'test.csv' HEADER CSV
Je puis exécutez ce et obtient l'erreur de syntaxe:
$ psql [system specific] -f copy_test.sql
CREATE TABLE
INSERT 0 5
psql:copy_test.sql:12: \copy: parse error at end of line
psql:copy_test.sql:19: ERROR: syntax error at or near ")"
LINE 7: ) TO 'test.csv' HEADER CSV
^
Un exercice similaire de faire une simple requête sans tableau croisé fonctionne sans incident.
Quelle est la cause de l'erreur de syntaxe et comment puis-je copier ce tableau dans un fichier csv à l'aide du fichier de script?
\copy
comme-est de la psql
ligne de commande?Correct. Droit de copier-coller le fait.
Pour le fou rire, essayez de prendre tous les retours à la ligne de la
\copy
commande dans votre fichier et de voir ce qui se passe.Ok, il semble y avoir un problème avec les retours à la ligne. Il fonctionne si il n'existe pas de caractères de saut de ligne, mais tous les retours à la ligne créer une erreur de syntaxe à la parenthèse fermante.
OriginalL'auteur David Kelley | 2015-04-14
Vous devez vous connecter pour publier un commentaire.
Comme avec cette réponse, créer un multi-ligne
VIEW
avec une seule ligne de\copy
de commande, par exemple:OriginalL'auteur Mike T
psql
pense que votre première commande est juste\copy (
et les lignes ci-dessous qui sont d'un autre énoncé. Les méta-commandes ne sont pas réparties sur plusieurs lignes, parce que le saut de ligne est un terminator pour eux.Extraits pertinents de psql page de manuel avec une certaine emphase ajoutée:
Donc, la première erreur est que
\copy (
à défaut, puis les lignes ci-dessous sont interprétés comme un indépendant SÉLECTIONNEZ qui a l'air bien jusqu'à ce que la ligne 7 lorsqu'il y a une fausse parenthèse fermante.Comme dit dans les commentaires, la solution serait de le fourrer l'ensemble de la méta-commande sur une seule ligne.
OriginalL'auteur Daniel Vérité
Selon la
psql
la documentation:Ce serait l'un de ces cas où la
-f
option traite votre entrée différemment à partir de la ligne de commande. La suppression de vos retours à la ligne ont travaillé, de rediriger le fichier d'origine pourpsql
'stdin aurait probablement fonctionné aussi bien.OriginalL'auteur Politank-Z
Les réponses répertoriées ici d'expliquer le raisonnement tout à fait clairement. Voici un petit hack qui vous permet d'avoir votre sql contenir plusieurs lignes et de travailler avec psql.
OriginalL'auteur Khaja Minhajuddin