web-dev-qa-db-fra.com

Comment puis-je spécifier le schéma pour exécuter un fichier SQL dans la ligne de commande Postgresql

Je lance des scripts sur ma base de données comme ceci ...

psql -d myDataBase -a -f myInsertFile.sql

Le seul problème est que je veux pouvoir spécifier dans cette commande le schéma sur lequel exécuter le script. Je pourrais appeler set search_path = 'my_schema_01' mais les fichiers sont supposés être portables. Comment puis-je faire ceci?

38
benstpierre

Vous pouvez créer un fichier contenant l'instruction set schema ..., puis inclure le fichier à exécuter:

Créer un fichier run_insert.sql:

set schema 'my_schema_01';
\i myInsertFile.sql

Ensuite, appelez ceci en utilisant:

psql -d myDataBase -a -f run_insert.sql
58

Une méthode plus universelle consiste à définir search_path (devrait fonctionner dans PostgreSQL 7.x et versions ultérieures):

SET search_path TO myschema;

Notez que set schema myschema est un alias de la commande ci-dessus, not disponible dans la version 8.x.

Voir aussi: http://www.postgresql.org/docs/9.3/static/ddl-schemas.html

39
Nux

Exemple principal

L'exemple ci-dessous exécute myfile.sql sur la base de données mydatabase à l'aide du schéma myschema.

psql "dbname=mydatabase options=--search_path=myschema" -a -f myfile.sql

La façon dont cela fonctionne est le premier argument de la commande psql est l'argument nombase. Les documents mentionnant un chaîne de connexion peuvent être fournis.

Si ce paramètre contient un signe = ou commence par un préfixe d'URI valide (postgresql: // ou postgres: //), il est traité comme une chaîne conninfo

Le mot-clé nom_bd spécifie la base de données à laquelle se connecter et le mot-clé options vous permet de spécifier les options de ligne de commande à envoyer au serveur au démarrage de la connexion. Ces options sont détaillées dans le chapitre sur la configuration du serveur . L'option que nous utilisons pour sélectionner le schéma est chemin_recherche .

Un autre exemple

L'exemple ci-dessous se connecte à l'hôte mon hôte de la base de données ma base de données à l'aide du schéma myschema. Le caractère spécial = doit être l'URL échappée avec la séquence d'échappement %3D

psql postgres://myuser@myhost?options=--search_path%3Dmyschema
27
Marwan Alsabbagh

La variable d'environnement PGOPTIONS peut être utilisée pour y parvenir de manière flexible.

Dans un shell Unix:

PGOPTIONS="--search_path=my_schema_01" psql -d myDataBase -a -f myInsertFile.sql

S'il y a plusieurs appels dans le script ou sous-shells qui nécessitent les mêmes options, il est plus simple de définir PGOPTIONS une seule fois et de l'exporter.

PGOPTIONS="--search_path=my_schema_01"
export PGOPTIONS

psql -d somebase
psql -d someotherbase
...

ou invoquer le script Shell de niveau supérieur avec PGOPTIONS défini de l'extérieur

PGOPTIONS="--search_path=my_schema_01"  ./my-upgrade-script.sh

Dans l’environnement Windows CMD, set PGOPTIONS=value devrait fonctionner de la même manière.

4
Daniel Vérité

J'utilise quelque chose comme ça et fonctionne très bien: * :-)

(echo "set schema 'acme';" ; \
  cat ~/git/soluvas-framework/schedule/src/main/resources/org/soluvas/schedule/tables_postgres.sql) \
  | psql -Upostgres -hlocalhost quikdo_app_dev 

Remarque: Linux/Mac/Bash uniquement, bien qu'il existe probablement un moyen de le faire dans Windows/PowerShell également.

1
Hendy Irawan