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?
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
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
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
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.
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.