web-dev-qa-db-fra.com

Comment exécuter les requêtes SQL de postgres à partir d'un fichier batch?

J'ai besoin d'exécuter SQL à partir d'un fichier de commandes. J'exécute les étapes suivantes pour me connecter à Postgres et sélectionner les données du tableau

C:/pgsql/bin/psql -h %DB_Host% -p 5432 -U %DB_USER% -d %DB_NAME% 
select * from test;

Je peux me connecter à la base de données, mais je reçois l'erreur

'select' n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes.

Quelqu'un at-il fait face à un tel problème?

C’est l’une des requêtes que j’essaie, quelque chose de similaire fonctionne dans un script Shell (veuillez ignorer l’erreur de syntaxe dans la requête s’il en existe).

copy testdata (col1,col2,col3) from '%filepath%/%csv_file%' with csv;
5
Ketu

Vous pouvez le diriger vers psql

(
echo select * from test;
) | C:/pgsql/bin/psql -h %DB_Host% -p 5432 -U %DB_USER% -d %DB_NAME% 

Lorsque les parenthèses de fermeture font partie de la requête SQL, elles doivent être échappées avec trois carets.

( 
echo insert into testconfig(testid,scenarioid,testname ^^^) values( 1,1,'asdf'^^^);
) | psql -h %DB_Host% -p 5432 -U %DB_USER% -d %DB_NAME%
5
jeb

Veuillez vous référer à la documentation

1] si vous transmettez le fichier avec le paramètre SQL utiliser -f ou --file
2] si vous passez une commande individuelle, utilisez le paramètre -c ou --command

0
Spidey

Je suis d'accord avec Spidey:

1] si vous transmettez le fichier avec le paramètre sql use -f ou --file

Lorsque vous voulez exécuter plusieurs commandes, la meilleure façon de le faire est d’ajouter le paramètre -f, puis tapez simplement chemin de votre fichier sans marque "ou '(les chemins relatifs fonctionnent également):

psql -h %Host% -p 5432 -U %user% -d %dbname% -f ..\..\folder\Data.txt

Cela fonctionne également dans .NET Core. J'en ai besoin pour ajouter des données de base à ma base de données après les migrations.

0
greygreg87

Vous ne pouvez pas placer la requête sur une ligne séparée, l’interprète batch supposera qu’il s’agit d’une autre commande au lieu d’une requête pour psql. Je crois que vous devrez aussi le citer.

0
LeleDumbo

Utilisez le paramètre -f pour passer le nom du fichier de commandes.

C:/pgsql/bin/psql -h %DB_Host% -p 5432 -U %DB_USER% -d %DB_NAME% -f 'sql_batch_file.sql'

http://www.postgresql.org/docs/current/static/app-psql.html

-f nom de fichier

--file = nom du fichier

Utilisez le fichier nomfichier comme source de commandes au lieu de les lire de manière interactive. Une fois le fichier traité, psql se termine. Ceci est à bien des égards équivalent à la méta-commande\i.

Si nomfichier est - (trait d'union), l'entrée standard est lue jusqu'à une indication EOF ou une méta-commande\q. Notez cependant que Readline n'est pas utilisé dans ce cas (comme si -n avait été spécifié).

0
Clodoaldo Neto