psql

Name

psql --  Terminal interactif PostgreSQL

Synopsis

psql [ options ] [ dbname [ user ] ]

Sommaire

psql est un client PostgreSQL en mode terminal. Il vous permet d'entrer vos requêtes de façon interactive, de les envoyer à PostgreSQL, et de voir le résultat. Alternativement, les entrées peuvent provenir d'un fichier. De plus, il procure un certain nombre de meta-commandes et diverses fonctionnalités de type shell pour faciliter l'écriture de scripts et automatiser une grande variété de tâches.

Description

Connexion à une base

psql est une application cliente PostgreSQL. Pour vous connecter à une base vous devez connaître le nom de la base cible, le nom d'hôte, le numéro de port du serveur et le nom d'utilisateur à utiliser pour vous connecter. psql peut énumerer ces paramètres via les options en ligne de commande, telles -d, -h, -p, et -U respectivement0. Si un argument est trouvé qui ne correspond à aucune option il sera interprété comme le nom de la base (ou le nom d'utilisateur, si le nom de la base est également donné). Pas toutes les options sont nécesssaires, celles par défaut sont appliquées. Si vous omettez le nom d'hôte psql se connectera via un socket de domaine Unix au serveur sur l'hôte local. Le numéro de port par défaut est déterminé à la compilation. Depuis que le serveur utilise le même par défaut, vous n'aurez pas à spécifier le port dans la plupart des cas. Le nom d'utilisateur par défaut est votre nom d'utilisateur Unix, comme le nom de la base. Notez que vous ne pouvez pas simplement vous connecter à une base sous un nom quelconque. Votre administrateur de la base devrait vous avoir informé sur vos droits d'accès. Pour vous éviter des frappes au clavier vous pouvez aussi placer les variables d'environnement PGDATABASE, PGHOST, PGPORT et PGUSER aux valeurs appropriées.

Si la connexion ne peut être faite pour une raison quelconque (ex. droits insuffisants, postmaster ne tournant pas sur le serveur, etc.), psql renverra une erreur et se stoppera.

Entrées des requêtes

En opération normale, psql fournit un prompt avec le nom de la base à laquelle psql est connecté, suivi par la chaîne =>. Par exemple,

$ psql testdb
Welcome to psql, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

testdb=>

Au prompt, l'utilisateur peut taper des requêtes SQL. Ordinairement, les lignes entrées sont envoyées au serveur quand un point-virgule terminant la ligne est atteint. Une fin de ligne ne termine pas une requête ! Ainsi les requêtes peuvent s'étendre sur plusieurs lignes pour des raisons de clarté. Si la requête a été envoyée sans erreur, le résultat sera affiché à l'écran.

Chaque fois qu'une requête est exécutée, psql choisit aussi pour la notification asynchrone des événements générés par LISTEN et NOTIFY.

psql Meta-Commands

Quoique vous entriez dans psql ça débutera par un backslash (sans guillemets) qui est une meta-commande psql traitée par psql lui-même. Ces commandes rendent psql intéressant pour l'administration ou l'édition de scripts. Les meta-commandes sont plus communément appelées commandes slash ou backslash.

Le format d'une commande psql est le backslash, suivi immédiatement par une commande en lettres, et certains arguments. Les arguments sont séparés de la commande en lettres par un certain nombre d'espaces.

Pour inclure des espaces dans un argument vous devez le mettre entre guillemets (simples guillemets). Pour inclure un simple guillemet dans un argument, faites le précéder d'un backslash. Certains éléments contenus dans les guillemets sont, en outre, sujets aux substitutions de style C pour \n (saut de ligne), \t (tab), \digits, \0digits, et \0xdigits (le caractère avec le code décimal, octal ou hexadécimal donné).

Si un argument sans guillemets débute avec deux-points (:), il est pris comme une variable et la valeur de la variable est prise comme argument.

Les arguments quotés dans des "backticks" (`) sont considérés comme ligne de commande passée au shell. La sortie de la commande est prise comme valeur d'argument. Les séquences d'échappement s'appliquent aussi aux backticks.

Certaines commandes prennent le nom d'un identifiant SQL (comme un nom de table) comme argument. Ces arguments suivent les règles de syntaxe du SQL en ragard des guillemets doubles : un identifiant sans guillemets doubles est forcé en minuscules. Pour toutes les autres commandes les guillemets doubles ne sont pas spéciaux et peuvent faire partie d'un argument.

L'analyse des arguments s'arrête quand un backslash sans guillemets apparaît. Ceci est pris comme le début d'une nouvelle meta-commande. La séquence spéciale \\ (deux backslashes) indique la fin des arguments et continue l'analyse SQL des requêtes, s'il y a lieu. Ces commandes SQL et psql peuvent être librement mélangées sur une ligne. Mais dans certains cas, les arguments des meta-commandes ne peuvent continuer au-delà de la fin de la ligne.

Les meta-commandes suivantes sont définies :

\a

Si le format de sortie de la table courante n'est pas aligné, le transforme en aligné. Et l'inverse pour le rendre non aligné. Cette commande est conservée pour des raisons de compatibilité d'arrière-plan. Voir \pset pour une solution générale.

\cd [répertoire]

Change le répertoire de travail courant en répertoire. Sans argument, change le répertoire home de l'utilisateur courant.

Tip

Pour afficher votre répertoire de travail courant, utilisez \!pwd.

\C [ titre ]

Place le titre de certaines tables comme le résultat affiché d'une requête ou enlève ces titres. Cette commande est équivalente à \pset titre titre. (Le nom de cette commande vient de "caption", et était seulement utilisée précédemment pour placer l'en-tête (caption) dans une table HTML).

\connect (ou \c) [ dbname [ username ] ]

Etablit une connexion à une nouvelle base et/ou sous un nom d'utilisateur. La connexion précédente est fermée. Si dbname est - le nom de la base courante est supposé.

Si username est omis le nom de l'utilisateur courant est supposé.

Comme règle spéciale, \connect sans autre argument se connectera à la base par défaut comme à l'utilisateur par défaut (ceux que vous aurez donné au lancement de psql sans autres arguments).

Si la tentative de connexion échoue (mauvais nom d'utilisateur, accès interdit, etc.), la connexion précédente est conservée si et seulement si psql est en mode interactif. En mode de script non-interactif, l'exécution stoppera immédiatement avec une erreur. Cette distinction fut choisie pour des raisons de commodité utilisateur.

\copy table [ with oids ] { from | to } filename | stdin | stdout [ using delimiters 'characters' ] [ with null as 'string' ]

Exécute une copie cliente. C'est une opération qui lance une commande SQL COPY, mais au lieu de la lecture ou de l'écriture du fichier spécifique par le serveur, et en conséquence nécessitant des accès au serveur et des droits d'utilisateur spécial, aussi bien qu'étant limité au fichier système accessible par le serveur, psql lit ou écrit le fichier et route les données entre le serveur et le fichier système local.

La syntaxe de la commande est similaire à la commande SQL COPY (voir sa description pour les détails). Notez que, à cause de ça, des règles d'analyse spéciales s'appliquent à la commande \copy. En particulier, les règles de substitution variables et les backslashes d'échappement ne s'appliquent pas.

Tip

Cette opération n'est pas aussi efficace que la commande SQL COPY car toutes les données doivent passer à travers une connexion IP client/serveur ou socket. Pour de gros volumes de données l'autre technique peut être préférable.

Note

Notez la différence dans l'interprétation de stdin et stdout entre les copies du serveur et du client : dans une copie cliente elle se réfère toujours aux entrées/sorties de psql. Sur une copie serveur stdin la commande COPY provient de n'importe où (par exemple, un script lancé avec l'option -f), et stdout se réfère à la sortie de la requête (voir la meta-commande \o plus bas).

\copyright

Affiche le copyright et les termes de distribution de PostgreSQL.

\d relation

Affiche toutes les colonnes de la relation (laquelle peut être une table, une vue, un index ou une séquence), leurs types, et certains attributs spéciaux comme NOT NULL. Si la relation est, en fait, une table, certains indexes définis, les clés primaires, les contraintes uniques et les vérification de contrainte sont aussi affichées. Si la relation est une vue, la définition de la vue est aussi affichée.

La commande \d+ est identique, mais certains commentaires associés aux colonnes de la table sont également affichés.

Note

Si \d est appelé sans aucun argument, c'est équivalent à \dtvs lequel affichera une liste de toutes les tables, vues et séquences. Ceci est une mesure de pur confort.

\da [ pattern ]

Liste toutes les fonctions agrégat disponibles, avec les types opérant ensemble. Si pattern (une expression régulière) est spécifié, seuls les agrégats appariés sont indiqués.

\dd [ object ]

Affiche les descriptions de object (lequel peut être une expression régulière), ou tous les objets si aucun argument n'est fourni. ("Object" couvre les agrégats, fonctions, operateurs, types, relations (tables, vues, indexes, séquences, objets longs), règles, et déclencheurs). Par exemple :

=> \dd version
              Object descriptions
  Name   |   What   |        Description
---------+----------+---------------------------
 version | function | PostgreSQL version string
(1 row)

Les descriptions des objets peuvent être générées par la commande SQL COMMENT ON.

Note

PostgreSQL stocke les descriptions d'objets dans la table système pg_description.

\df [ pattern ]

Affiche les fonctions disponibles, avec leur argument et les types retour. Si pattern (une expression régulière) est spécifié, seules les fonctions appariées sont affichées. Si la forme \df+ est utilisée, des informations supplémentaires sur chaque fonction, incluant langage et description, sont affichées.

\distvS [ pattern ]

Ce n'est pas le nom de commande actuel : les lettres i, s, t, v, S correspondent à index, séquence, table, vue et table système respectivement. Vous pouvez en spécifier certains ou tous afin d'en obtenir une liste, avec le propriétaire.

Si pattern est spécifié, c'est une expression régulière qui restreint l'affichage aux objets dont le nom s'apparie. Si un "+" est joint au nom de commande, chaque objet est affiché avec sa description associée, s'il y a lieu.

\dl

C'est un alias pour \lo_list, qui affiche une liste d'objets longs.

\do [ name ]

Affiche les opérateurs disponibles avec leurs opérandes et types retour. Si name est spécifié, seuls les opérateurs avec ce nom seront affichés.

\dp [ pattern ]

C'est un alias pour \z lequel fut inclu pour sa forte valeur mnémonique ("affiche les droits").

\dT [ pattern ]

Affiche tous les types ou seulement ceux qui apparient pattern. La commande \dT+ affiche des informations supplémentaires.

\du [ pattern ]

Affiche tous les utilisateurs configurés ou seulement ceux qui apparient pattern.

\edit (ou \e) [ nom de fichier ]

Si nom de fichier est spécifié, le fichier est édité; ensuite son contenu est copié vers le tampon de requête. Si aucun argument n'est donné, le tampon de requête courant est copié vers un fichier temporaire qui est alors édité de la même façon.

le nouveau tampon de requête est alors re-analysé selon les règles normales de psql, où le tampon complet est traité sur une seule ligne. (Ainsi vous ne pouvez réaliser des scripts de cette façon. Utilisez \i pour ça). Ceci indique aussi que si la requête se termine avec (ou au moins contient) un point-virgule, elle sera immédiatement exécutée. Dans d'autres cas elle sera tout simplement en attente dans le tampon de requête.

Tip

psql recherche les variables d'environnement PSQL_EDITOR, EDITOR, et VISUAL (dans cet ordre) pour usage d'édition. Si aucune n'est placée /bin/vi est lancé.

\echo text [ ... ]

Affiche les arguments vers la sortie standard, séparés par un espace et suivis par un saut de ligne. Ceci peut être utile pour l'information entremêlée dans la sortie des scripts. Par exemple :

=> \echo `date`
Tue Oct 26 21:40:57 CEST 1999
Si le premier argument est un -n sans guillemets, le saut de ligne n'est pas écrit.

Tip

Si vous utilisez la commande \o pour rediriger les sorties de vos requêtes, vous pourrez vouloir utiliser \qecho au lieu de cette commande.

\encoding [ encoding ]

Place le client d'encodage, si vous utilisez l'encodage multi-octets. Sans argument, cette commande affiche l'encodage courant.

\f [ chaîne ]

Place le séparateur de champ pour les sorties de requêtes non alignées. Par défaut c'est un pipe (|). Voir aussi \pset pour un moyen générique de placement des options de sortie.

\g [ { nom de fichier | |commande } ]

Envoie le tampon d'entrée de requête courante au serveur et optionnellement sauvegarde les sorties dans nom de fichier ou pipe les sorties dans un shell Unix séparé pour exécuter la commande. Un \g nu est virtuellement équivalent à un point-virgule. Un \g avec argument est une alternative à "coup sûr" à la commande \o.

\help (ou \h) [ commande ]

Fournit la syntaxe d'aide sur la commande SQL spécifiée. Si commande n'est pas spécifiée, psql affichera toutes les commandes pour lesquelles la syntaxe d'aide est disponible. Si commande est un astérisque ("*"), la syntaxe d'aide sur toutes les commandes SQL est affichée.

Note

Pour simplifier la frappe, les commandes consistant en plusieurs mots n'ont pas à être entre guillemets. Ainsi il est pratique de taper \help alter table.

\H

Passe le format de sortie de la requête en HTML. Si le format HTML est déja en place, il est transformé en format text. Cette commande existe pour des raisons de compatibilité et de confort, mais voir \pset à propos des autres options de sortie.

\i filename

Lit l'entrée depuis le fichier filename et l'exécute pour autant qu'il ait été tapé au clavier.

Note

Si vous voulez voir les lignes à l'écran telles qu'elles ont été lues vous devez placer la variable ECHO à all.

\l (ou \list)

Affiche toutes les bases sur le serveur ainsi que leur propriétaire. Ajoutez un "+" à la commande pour voir la description des bases. Si votre installation PostgreSQL a été compilée avec le support d'encodage multi-octets, le schéma d'encodage de chaque base est indiqué.

\lo_export loid nom de fichier

Lit les objets longs avec OID loid depuis la base et écrit vers nom de fichier. Notez la subtile différence avec la fonction serveur lo_export, laquelle agit avec les droits de l'utilisateur que le serveur lance et sur le système de fichiers du serveur.

Tip

Utilisez \lo_list pour trouver les OID des objets longs.

Note

Voir la description de la variable LO_TRANSACTION pour information importante concernant toutes les opérations sur les objets longs.

\lo_import nom de fichier [ commentaire ]

Stocke le fichier dans un "objet long" PostgreSQL. Optionellement, il associe le commentaire donné avec l'objet. Exemple:

foo=> \lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
lo_import 152801
La réponse indique que l'objet long a reçu l'id objet 152801. Il est recommendé de toujours associer un commentaire avec chaque objet. Celui-ci peut alors être vu avec la commande \lo_list.

Notez que cette commande est différente du côté serveur lo_import car elle agit comme l'utilisateur local sur le système de fichier local, d'avantage que l'utilisateur du serveur et le fichier système.

Note

Voir la description de la variable LO_TRANSACTION pour information importante concernant toutes les opérations sur les objets longs.

\lo_list

Affiche la liste de tous les "objets longs" PostgreSQL stockés dans la base, avec les commentaires.

\lo_unlink loid

Supprime les objets longs avec l'OID loid de la base.

Tip

Utilise \lo_list pour découvrir l'OID des objets longs.

Note

Voir la description de la variable LO_TRANSACTION pour information importante concernant toutes les opérations sur les objets longs.

\o [ {nom de fichier | |commande} ]

Sauvegarde les futurs résultats des requêtes dans un fichier ou pipe les futurs résultats dans un shell Unix séparé pour exécuter la commande. Si uncun argument n'est spécifié, la sortie de la requête sera envoyée vers stdout.

Les "résultats de requête" incluent toutes les tables, les réponses aux commandes, et les notifications obtenues du serveur de la base, aussi bien que les sorties de divers commandes backslash qui questionnent la base (comme \d), mais pas les messages d'erreur.

Tip

Pour intercaler des sorties texte entre des résultats de requêtes, utilisez \qecho.

\p

Affiche le tampon de requête courant sur la sortie standard.

\pset paramètre [ valeur ]

Cette commande place les options affectant les sorties des résultats de requêtes sur les tables. paramètre décrit quelle option doit être placée.

Les options d'affichage ajustables sont :

format

Place le format de sortie à un des unaligned, aligned, html, ou latex. Une seule abréviation est admise. (Ce qui veut dire qu'une lettre est suffisante).

"Unaligned" écrit tous les champs d'un tuple sur une ligne, séparés par le séparateur de champ actif (courant). Ceci dans le but de créer des sorties qui pourraient être lues par d'autres programmes (spération par des tabulations, séparations par des virgules). Le mode "Aligned" est le standard, lisible, formaté en texte par défaut. Les modes "HTML" et "LaTeX" traitent les tables à inclure dans des documents utilisant ces langages respectifs. ce ne sont pas des documents complets ! (Ce peut ne pas être dramatique en HTML, mais en LaTeX vous devez avoir une enveloppe de document complète).

border

Le second argument peut être un nombre. En général, le plus grand le plus de lignes qu'il peut avoir, mais dépend du format particulier. En mode HTML, ça se traduira directement en attribut border=..., dans les autres seules les valeurs 0 (pas de bordure), 1 (lignes internes), et 2 (cadre de table) ont un sens.

expanded (ou x)

Bascule entre le format normal et étendu. Quand le format étendu est activé, toutes les sorties ont deux colonnes avec le champ nom sur la gauche et les données sur la droite. Ce mode est pratique si les données ne sont pas ajustées à l'écran dans le mode "horizontal" normal.

Le mode étendu est supporté par les quatre modes de sorties.

null

Le second argument est une chaîne qui devrait être imprimée chaque fois qu'un champ est nul. Par défaut il n'imprime rien, et peut être trompé par une chaîne vide. Ainsi, on peut choisir d'écrire \pset null '(null)'.

fieldsep

Spécifie le séparateur de champ à utiliser en mode sortie non alignée. Avec ce moyen on peut créer, par exemple, une sortie séparée par une tabulation ou une virgule, ou autre selon ce que les programmes préfèrent. Pour placer une tabulation comme séparateur de champ, tapez \pset fieldsep '\t'. Le champ séparateur par défaut est '|' (un symbole "pipe").

footer

Bascule l'affichage du page de page par défaut (x lignes).

recordsep

Spécifie le séparateur d'enregistrement (ligne) à utiliser en mode sortie non alignée. Par défaut c'est un caractère saut de ligne.

tuples_only (ou t)

Bascule entre les tuples seulement et l'affichage complet. L'affichage complet peut montrer des informations supplémentaires comme les en-têtes de colonnes, titres, et pieds de page variés. En mode tuple seulement, seule la table actuelle est affichée.

title [ texte ]

Place le titre de la table pour les tables imprimées sous jacentes. Ceci peut être utilisé pour fournir des tags descriptifs dans vos sorties. Si aucun argument n'est donné, le titre n'est pas placé.

Note

Ceci concernait seulement le mode HTML. Vous pouvez maintenant placer des titres dans n'importe quel format.

tableattr (ou T) [ texte ]

Vous permet de spécifier des attributs à placer dans le tag de la table HTML. Ce peut être, par exemple, cellpadding ou bgcolor. Notez que vous ne spécifierez sans doute pas border ici, mais utiliserez \pset border.

pager

Bascule la liste d'un pager vers une sortie table. Si la variable d'environnement PAGER est placée, la sortie est pipée vers un programme spécifique. Sinon more est utilisé.

Dans certains cas, psql utilise le pager si il semble approprié. Ceci fait que parmi d'autres choses la sortie est faite vers le terminal et que la table ne s'ajustera pas normalement à l'écran. À cause de la nature modulaire des routines d'impression il n'est pas toujours possible de prévoir le nombre de lignes qui seront imprimées. Pour cette raison psql peut ne pas apparaître très discriminant quand à l'utilisation du pager.

Des illustrations montrant comment ces différents formats se présentent peuvent être vus dans la section Exemples.

Tip

Il y a diverses commandes de raccourcis pour \pset. Voir \a, \C, \H, \t, \T, et \x.

Note

C'est une erreur d'appeler \pset sans arguments. Dans le futur cet appel pourrait indiquer le status des options d'impression.

\q

Quitte le programme psql.

\qecho texte [ ... ]

Cette commande est identique à \echosauf que toutes les sorties devront être écrites vers le canal de sortie de requête, comme placé par \o.

\r

Réinitialise le tampon de requête.

\s [ nom de fichier ]

Imprime ou sauvegarde l'histoqrique de la ligne de commande vers nom de fichier. Si nom de fichier est omis l'historique est écrit dans la sortie standard. Cette option est seulement disponible si psql est configuré pour utiliser la bibliothèque GNU history.

Note

Dans cette version, il n'est pas nécessaire de seuvegarder la commande historique, ce sera fait automatiquement en fin de programme. L'historique est aussi chargé automatiquement à chaque démarrage de psql.

\set [ name [ value [ ... ]]]

Place la variable interne name à value ou, si plus d'une valeur est donnée, à la concaténation de toutes celles-ci. Si aucun second argument n'est donné, la variable est simplement placée sans valeur. Pour enlever une variable, utilisez la commande \unset.

Les noms de variables valides peuvent contenir des caractères, des chiffres et des soulignés. VOir la section sur les variables psql pour les détails.

Bien que nous puissions placer des variables comme nous le souhaitons, psql traite certaines variables de façon particulière. Elles sont documentées dans la section sur les variables.

Note

Cette commande est totalement séparée de la commande SQL SET.

\t

Bascule l'affichage des en-têtes de colonnes en compteur en pied de ligne. Cette commande est équivalente à \pset tuples_only et est fournie pour raison de confort.

\T table_options

Vous permet de spécifier les options à placer dans table en sortie mode table HTML. Cette commande est équivalente à \pset tableattr table_options.

\w {nom de fichier | |commande}

Envoi du tampon de requête en cours vers le fichier nom de fichier ou pipe vers la commande Unix commande.

\x

Bascule le mode format de ligne étendu. Équivalent à \pset expanded.

\z [ pattern ]

Produit une liste de toutes les tables de la base avec leur privilèges d'accès. Si un argument est donné il est pris comme expression régulière qui limite l'affichage des tables qui s'apparient à lui.

test=> \z
Access permissions for database "test"
 Relation |           Access permissions
----------+-------------------------------------
 my_table | {"=r","joe=arwR", "group staff=ar"}
(1 row )
Explication :

  • "=r": PUBLIC en lecture (SELECT) sur la table.

  • "joe=arwR": L'utilisateur joe peut lire, écrire (UPDATE, DELETE), "append" (INSERT), et peut aussi créer des règles sur la table.

  • "group staff=ar": Le groupe staff a les droits SELECT et INSERT .

Les commandes GRANT et REVOKE sont utilisées pour placer les droits d'accès.

\! [ commande ]

Échappement vers un shell Unix séparé ou exécute la commande Unix commande. Les arguments ne sont plus interprétés.

\?

Apporte de l'aide sur les commandes backslash ("\").

Options de la ligne de commande

psql comprend les deux standards Unix options courtes, et les options longuesGNU-style. Les dernières ne sont pas disponibles sur tous les systèmes.

-a, --echo-all

Affiche toutes les lignes à l'écran comme elles sont lues. C'est plus pratique pour l'exécution de scripts que le mode interactif. C'est équivalent à placer la variable ECHO à all.

-A, --no-align

Permute en mode sortie non aligné. (Le mode par défaut est aligné).

-c, --command query

Spécifie que psql exécute une chaîne de requête, query, et s'arrête. C'est pratique pour les scripts shell.

query doit être soit une chaîne de requête complètement analysable par le serveur (i.e., elle ne contient pas de fonctionnalités spécifiques à psql), soit une commande backslash simple. Ainsi, vous ne pouvez pas mélanger des meta-commandes SQL et psql. Pour finir, vous pouvez faire un pipe de la chaîne dans psql, comme ça : echo "\x \\ select * from foo;" | psql.

-d, --dbname dbname

Spécifie le nom de la base à laquelle se connecter. Ce qui est équivalent à spécifier dbname comme premier argument non-optionnel de la ligne de commande.

-e, --echo-queries

Indique toutes les requêtes envoyées au serveur. Ce qui est équivalent à placer la variable ECHO aux queries.

-E, --echo-hidden

Fait un écho des requêtes actuelles générées par \d et autres commandes backslash. Vous pouvez l'utiliser si vous voulez inclure des fonctionnalités similaires dans vos propres programmes. Ce qui est équivalent à placer la variable ECHO_HIDDEN depuis psql.

-f, --file filename

Utilise le fichier filename comme source des requêtes au lieu de lire les requêtes de façon interactive. Une fois le fichier traité, psql s'arrête. Équivalent à la commande interne \i.

Si filename est - (trait d'union), la sortie standard est lue.

Utiliser cette option est subtilement différent d'écrire psql < filename. En règle générale, les deux feront ce que vous attendez, mais utiliser -f permet certaines fonctionnalités pratiques comme les messages d'erreur avec le numéro de ligne. Il y a aussi une faible chance pour que l'utilisation de cette option réduise le temps de démarrage. D'un autre côté, la variante utilisant la redirection d'entrée shell est (en théorie) garantie pour produire exactement la même sortie que vous aurez obtenue si vous aviez tout rentré à la main.

-F, --field-separator separator

Utilisez separator comme séparateur de champ. Équivalent à \pset fieldsep ou \f.

-h, --host nom d'hôte

Spécifie le nom d'hôte de la machine sur laquelle le postmaster tourne. Si l'hôte commence avec un slash, il est utilisé comme répertoire de socket de domaine Unix.

-H, --html

Passe en sortie table HTML. Équivalent à \pset format html ou à la commande \H.

-l, --list

Liste toutes les bases disponibles. Les autres options de non-connexion sont ignorées. Ceci est similaire à la commande interne \list.

-o, --output filename

Place toutes les sorties de requêtes dans un fichier filename. Équivalent à la commande \o.

-p, --port port

Spécifie le port TCP/IP ou, par omission, l'extension de fichier du socket de domaine local Unix sur lequel le postmaster est en attente de connexions. Par défaut c'est la valeur de la variable d'environnement PGPORT ou, si elle n'est pas placée, au port spécifié à la compilation, habituellement 5432.

-P, --pset affectation

Vous permet de spécifier les options d'impression dans le style de \pset en ligne de commande. Notez que ici vous aurez à séparer nom et valeur avec un signe égal au lieu d'un espace. Ainsi, pour placer le format de sortie en LaTeX, vous écrirez -P format=latex.

-q

Spécifie que psql travaillera en silence. Par défaut, il affiche un message de bienvenue et autres informations. Si cette option est utilisée, rien n'apparaît. C'est pratique avec l'option -c. Dans psql vous pouvez aussi placer la variable QUIET pour obtenir le même effet.

-R, --record-separator separator

Utilisez separator comme séparateur d'enregistrement. Équivalent à la commande \pset recordsep.

-s, --single-step

Tourne en mode étape-par-étape. Ce qui veut dire que l'utilisateur est questionné avant chaque requête envoyée au serveur, avec l'option d'annuler l'exécution. Utilisez ceci pour débuguer les scripts.

-S, --single-line

Tourne en mode ligne-unique où un saut de ligne termine la requête, comme le fait un point-virgule.

Note

Ce mode est fourni pour ceux qui insisteraient, mais vous n'êtes pas nécessairement encouragés à l'utiliser. En particulier, si vous mélangez SQL et meta-commandes sur une ligne l'ordre d'exécution peut ne pas toujours être clair pour les utilisateurs inexpérimentés.

-t, --tuples-only

Désactive l'affichage des noms de colonnes et le compteur en pied de ligne, etc. Complètement équivalent à la meta-commande \t.

-T, --table-attr table_options

Vous permet de spécifier les options à placer dans les tags de table HTML. Voir \pset pour les détails.

-u

psql demandera le nom d'utilisateur et le mot-de-passe avant de se connecter à la base.

Cette option est déconseillée, car elle est conceptuellement défectueuse. (Questionner pour un nom d'utilisateur non par défaut et questionner pour un mot-de-passe parce que le serveur le nécessite sont deux choses réellement différentes). Vous êtes encouragés à regarder à la place les options -U et -W.

-U, --username username

Connexion à la base comme utilisateur username au lieu de l'utilisateur par défaut. (Vous devez avoir les droits pour le faire, bien sûr).

-v, --variable, --set affectation

Traite une affectation de variable, comme la commande interne \set. Notez que vous devez séparer nom et valeur, par un signe égal en ligne de commande. Pour enlever une variable, enlevez le signe égal. Pour placer simplement une variable sans une valeur, utilisez le signe égal mais sans valeur. Ces affectations sont faites très tôt lors du démarrage, ainsi les variables réservées pour des propos internes peuvent être utilisées plus tard.

-V, --version

Indique la version de psql.

-W, --password

psql demandera un mot-de-passe avant de se connecter à une base. Ceci fonctionnera pour la session entière, même si vous changez de connexion à une base avec la meta-ciommande \connect.

Dans cette version, psql affiche automatiquement un prompt pour le mot-de-passe chaque fois que le serveur demande une authentification par mot-de-passe. Si aucun prompt pour le mot-de-passe n'est affiché et que le serveur nécessite une authentification la connexion échouera.

-x, --expanded

Active le mode format de ligne étendu. Équivalent à la commande \x.

-X, --no-psqlrc

Ne lit pas le fichier de démarrage ~/.psqlrc.

-?, --help

Affiche l'aide sur les arguments en ligne de commande de psql

Fonctionnalités avancées

Variables

psql fournit des fonctionnalités de substitution de variable similaires aux commandes shell Unix courantes. Cette fonctionnalité est nouvelle et pas très sophistiquée, mais il est prévu de l'améliorer dans le futur. Les variables sont de simples paires de nom/valeur, où la valeur peut être une chaîne de n'importe quelle longueur. Pour placer les variables, utilisez la meta-commande psql \set :

testdb=> \set foo bar
place la variable "foo" à la valeur "bar". Pour retrouver le contenu de la variable, faîtes précéder le nom par deux-points et utilisez le comme argument d'une commande slash :
testdb=> \echo :foo
bar

Note

Les arguments de \set sont sujets aux mêmes règles de substitution que les autres commandes. Ainsi, vous pouvez construire des références intéressantes comme \set :foo 'something' et obtenir des "soft links" ou des "variable variables" de Perl ou PHP, respectivement. Malheureusement (ou heureusement ?) il n'y a aucun moyen de faire quelque chose de pratique avec ces constructions. D'un autre côté, \set bar :foo est un moyen parfaitement valide pour copier une variable.

Si vous appelez \set sans second argument, la variable est simplement placée, mais n'a pas de valeur. Pour l'enlever (ou la supprimer), utilisez la commande \unset.

Les noms de variable internes de psql peuvent consister en lettres, chiffres, et soulignés dans n'importe quel ordre. Certaines variables régulières sont traitées spécialement par psql. Elles indiquent certains placements d'options qui peuvent être changés au lancement en altérant la valeur de la variable ou représente certains états de l'application. Bien que vous puissiez utiliser ces variables pour un autre propos, ce n'est pas recommandé, le comportement du programme peut devenir étrange très rapidement. Par convention, toutes les variables traitées spécialement consistent en toutes les lettres majuscules (et la possibilité des chiffres et des soulignés). Pour vous assurer le maximum de compatibilité dans le futur, évitez ces variables. Une liste de toutes les variables traitées spécialement suit.

DBNAME

Le nom de la base à laquelle vous êtes connecté. Placée chaque fois que vous vous connectez à une base (incluant le programme de démarrage), mais peut être enlevée.

ECHO

Si placée à "all", toutes les lignes entrées, ou depuis un script, seront écrites vers la sortie standard avant d'être analysées ou exécutées. Pour spécifier ceci au démarrage du programme, utilisez le commutateur -a. Si placée à "queries", psql affichera toutes les requêtes comme elles ont été envoyées au serveur. L'option pour ceci est -e.

ECHO_HIDDEN

Quand cette variable est placée et qu'une commande backslash interroge la base, la requête est affichée en premier. Par ce moyen vous pouvez étudier les constituants de PostgreSQL et fournir des fonctionnalités similaires à vos propres programmes. Si vous placez la variable à la valeur "noexec", les requêtes seront juste affichées mais pas envoyées au serveur et exécutées.

ENCODING

Le client courant d'encodage multi-octets. Si vous n'avez pas activé l'usage des caractères multi-octets, cette variable contiendra toujours du "SQL_ASCII".

HISTCONTROL

Si cette variable est placée à ignorespace, les lignes qui débutent avec un espace ne seront pas entrées dans l'historique. Si placée à une valeur ignoredups, les lignes appariant l'historique précédent ne seront pas entrées. Une valeur de ignoreboth combine les daux options. Si non placée, ou placée avec n'importe quelle autre valeur que celles ci-dessus, toutes les lignes lues en mode intercatif seront sauvegardées dans l'historique.

Note

Cette fonctionnalité a été effrontément plagiée du bash.

HISTSIZE

Le nombre de commandes à stocker dans l'historique. Par défaut 500.

Note

Cette fonctionnalité a été effrontément plagiée du bash.

HOST

Le serveur hôte sur lequel vous êtes connecté. Placée chaque fois que vous vous connectez à une base (incluant le programme de démarrage), mais peut être enlevée.

IGNOREEOF

Si non placée, envoit un caractère EOF (habituellement Control-D) qui terminera une session interactive de psql. Si placée à une valeur numérique, les différents caractères EOF seront ignorés avant que l'application se termine. Si la variable est placée mais n'a pas de valeur numérique, la valeur par défaut est 10.

Note

Cette fonctionnalité est effrontément plagiée du bash.

LASTOID

La valeur du dernier oid affecté, comme retourné d'une commande INSERT ou lo_insert. Cette variable est garantie valide seulement jusqu'après que le résultat de la prochaine commande SQL ait été affiché.

LO_TRANSACTION

Si vous utilisez l'interface d'objets longs PostgreSQL pour stocker spécialement des données qui ne s'adaptent pas dans un seul tuple, toutes les opérations doivent être contenues dans un block de transaction. (Voir la documentation sur l'interface des objets longs pour plus d'information). Parce que psql n'a aucun moyen de vous dire si vous avez déja une transaction en cours quand vous faîtes un appel à ses commandes internes (\lo_export, \lo_import, \lo_unlink) il doit faire une action arbitraire. cette action peut être soit stopper une transaction en cours, ou valider cette transaction, ou ne rien faire du tout. Dans le dernier cas vous devez fournir votre propre BEGIN TRANSACTION/COMMIT ou les résultats seront imprévisibles.

Pour choisir ce que vous voulez faire, vous placez cette variable à un des "rollback", "commit", ou "nothing". Par défaut c'est de stopper la transaction. Si vous voulez juste lancer un ou quelques objets c'est correct. Cependant, si vous avez l'intention de transférer divers objets longs, il sera avisé de fournir un bloc de transaction explicite.

ON_ERROR_STOP

Par défaut, si des scripts non-interactifs rencontrent une erreur, comme une requête SQL mal formée ou une meta-commande interne, le processus continue. Ceci a été le comportement traditionnel de psql mais il est quelque fois pas désirable. Si cette variable est placée, l'exécution du script se terminera immédiatement. Si le script a été appelé d'un autre script il se terminera de la même façon. Si le script le plus éloigné n'a pas été appelé depuis une session interactive psql mais en utilisant l'option -f, psql renverra une erreur code 3, à distinguer des conditions d'erreur fatale (code erreur 1).

PORT

Le port du serveur auquel vous êtes connecté. Placée chaque fois que vous vous connectez à une base (incluant le programme de démarrage), mais peut être enlevée.

PROMPT1, PROMPT2, PROMPT3

Spécifie que les sorties prompt psql sont supposées ressembler à ça. Voir "Prompting" plus bas.

QUIET

Cette variable est équivalente à l'option de ligne de commande -q. C'est probablement pas très pratique en mode interactif.

SINGLELINE

Cette variable est placée par l'option de ligne de commande -S. Vous pouvez l'enlever ou le replacer au lancement.

SINGLESTEP

Cette variable est équivalente à l'option de ligne de commande -s.

USER

Le nom d'utilisateur de la base dont vous vous êtes servi. Placée à chaque fois que vous vous connectez à une base (incluant le programme de démarrage), mais peut être enlevée.

Interpolation SQL

Une fonctionnalité pratique suplémentaire aux variables psql est que vous pouvez les substituer ("interpolate") en instructions SQL régulières. La syntaxe pour ceci fait de nouveau précéder le nom de deux points (:).

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :foo;
questionnerait alors la table my_table. La valeur de la variable est copiée litéralement, ainsi elle peut même contenir des guillemets non équilibrés ou des commandes backslash. Vous devez être sûr qu'elle a un sens là où vous la mettez. La variable d'interpolation ne sera pas exécutée dans des entités SQL entre guillemets.

Une application populaire de cette faculté est de se référer au dernier OID inséré dans des instructions sous-jacentes pour construire un scenario de clé étrangère. Un autre usage possible de ce mécanisme est de copier le contenu d'un fichier dans un champ. En premier charger le fichier dans une variable et ensuite procède comme suit :

testdb=> \set content '\'' `cat my_file.txt` '\''
testdb=> INSERT INTO my_table VALUES (:content);
Un problème possible avec cette aprocceh est que my_file.txt peut contenir des guillemets simples. Ceci nécessite d'être échappé pour ne pas causer d'erreur de syntaxe quand la troisième ligne est exécutée. Ceci peut être fait avec le programme sed :
testdb=> \set content '\'' `sed -e "s/'/\\\\\\'/g" < my_file.txt` '\''
Observez le nombre correct de backslashes (6)! Vous pouvez le résoudre par ce moyen : après que psql ait analysé cette ligne, il passe sed -e "s/'/\\\'/g" < my_file.txt au shell. Le shell fera sa propre cuisine à l'intérieur des doubles guillemets et exécutera sed avec les arguments -e et s/'/\\'/g. Quand sed analysera il remplacera les deux backslashes par un seul et ensuite fera la substitution. Peut être à ce point vous pensez qu'il serait bien que toutes les commandes Unix utilisent le même caractère d'échappement. C'est ignorer le fait que vous pouvez avoir à échapper tous les backslashes parce que les constantes texte SQL sont aussi sujettes à certaines interprétations. Dans ces conditions il serait mieux de préparer le fichier en externe.

Depuis que les deux points peuvent légalement apparaître dans les requêtes, la règle suivante s'applique : si la variable n'est pas placée, la séquence de caractères "deux points+nom" n'est pas changée. Dans certains cas vous pouvez échapper les deux points par un backslash pour éviter l'interprétation. (La syntaxe deux points pour les variables est standard SQL pour les langages de requêtes embarqués, comme ecpg. La syntaxe deux points pour les coupes de tableaux et les types cast sont des extensions PostgreSQL).

Prompting

Les sorties prompt psql peuvent être modifiées à votre préférence. Les trois variables PROMPT1, PROMPT2, et PROMPT3 contiennent des chaînes et des séquences spéciales d'échappement qui décrivent l'apprence du prompt. Le Prompt 1 est le prompt normal affiché quand psql sollicite une nouvelle requête. Le Prompt 2 est affiché quand d'avantage de données sont attendues pendant les entrées de la requête car la requête n'est pas terminée par un point-virgule ou un guillemet qui n'est pas fermé. Le Prompt 3 est affiché quand vous lancez une commande SQL COPY et que vous devriez taper dans les tuples sur le terminal.

La valeur de la variable de prompt respective est affichée littéralement, sauf quand un signe de pourcentage ("%") est rencontré. Dépendant du caractère suivant, certain autre texte est substitué. Les substitutions définies sont :

%M

Le nom d'hôte complet (avec nom de domaine) du serveur de la base, ou [local] si la connexion se fait sur un socket de domaine Unix, ou [local:/dir/name], si le socket de domaine Unix n'est pas compilé à l'endroit par défaut.

%m

Le nom d'hôte du serveur de la base, tronqué après le premier point ou [local] si la connexion se fait sur un socket de domaine Unix.

%>

Le numéro de port sur lequel le serveur de la base est en attente.

%n

Le nom d'utilisateur avec lequel vous êtes connecté pas votre nom d'utilisateur du système local).

%/

Le nom de la base courante.

%~

Comme %/, mais la sortie est "~" (tilde) si la base est votre base par défaut.

%#

Si l'utilisateur courant est le super-utilisateur de la base, alors c'est un "#", autrement un ">".

%R

Dans Prompt 1 normalement "=", mais "^" si en mode ligne unique, et "!" si la session est déconnectée de la base (ce qui peut arriver si \connect échoue). En prompt 2 la séquence est remplacée par "-", "*", un guillemet simple ou un double guillemet, ce qui dépend comment psql attend plus de données car la requête n'est pas encore terminée, car vous êtes entre commentaires /* ... */, ou parce que vous êtes entre guillemets. En prompt 3 la séquence ne résoudra rien.

%digits

Si digits démarre avec 0x le reste des caractères seront interprétés comme chiffres hexadécimaux et le caractère avec le code correspondant sera substituté. Si le premier chiffre est 0 les caractères sont interprétés comme nombre octal et le caractère correspondant est substitué. Sinon un nombre décimal est supposé.

%:name:

La valeur de psql, variable name. Voir la section "Variables" pour les détails.

%`command`

La sortie de command, similaire à une substitution ordinaire "recto-verso".

Pour insérer un signe pourcentage dans votre prompt, ecrire %%. Le prompt par défaut est équivalent à '%/%R%# ' pour les prompts 1 et 2, et '>> ' pour le prompt 3.

Note

Cette fonctionnalité a été effrontément plagiée du tcsh.

Divers

psql renvoie 0 au shell s'il se termine normalement, 1 si une erreur fatale de son propre fait (dépassement de mémoire, fichier non trouvé) apparaît, 2 si la connexion au serveur devient mauvaise et la session n'est pas interactive, et 3 si une erreur apparaît dans un script et que la variable ON_ERROR_STOP a été placée.

Avant de démarrer, psql tente de lire et d'exécuter les commandes depuis le fichier $HOME/.psqlrc. Il peut être utilisé pour paramètrer le client ou le serveur à votre goût (en utilisant les commandes \set et SET).

GNU readline

psql supporte les bibliothèques Readline et history pour faciliter l'édition et la recherche de lignes. L'historique des commandes est stocké dans un fichier nommé .psql_history dans votre répertoire et il est rechargé quand psql démarre. La complétion par tabulation est aussi supportée, bien que la complétion logique ne nécessite pas d'être un analyseur SQL. Si disponible, psql est automatiquement construit pour utiliser ces fonctionnalités. Si pour certaines raisons vous n'aimez pas la complétion, vous pouvez la désactiver en mettant ceci dans un fichier nommé .inputrc dans votre répertoire :

$if psql
set disable-completion on
$endif
(Ce n'est pas une fonctionnalité psql mais readline. Voir sa documentation pour les détails).

Si vous avez la bibliothèque readline installée mais que psql ne semble pas l'utiliser, vous devez vous assurer que le script de haut-niveau configure de PostgreSQL la trouve. configure nécessite de trouver les bibliothèques libreadline.a (ou une bibliothèque partagée équivalente) et les fichiers d'en-têtes readline.h et history.h (ou readline/readline.h et readline/history.h) dans les répertoires appropriés. Si vous avez la bibliothèque et les fichiers d'en-têtes installés dans un coin obscur, vous devez le faire savoir à configure, par exemple :

$ ./configure --with-includes=/opt/gnu/include --with-libs=/opt/gnu/lib  ...
Ensuite vous devrez recompiler psql (pas nécessairement le code complet).

La bibliothèque GNU readline peut être obtenue du serveur FTP du projet GNU sur ftp://ftp.gnu.org.

Exemples

Note

Cette section montre seulement quelques exemples spécifiques à psql. Si vous voulez apprendre le SQL ou devenir familier avec PostgreSQL, vous devriez lire le Tutoriel inclu dans cette documentation.

Le premier exemple montre comment déployer une requête sur plusieurs lignes. Notez le changement de prompt :

testdb=> CREATE TABLE my_table (
testdb(>  first integer not null default 0,
testdb(>  second text
testdb-> );
CREATE
Maintenant regardons la définition de table à nouveau :
testdb=> \d my_table
             Table "my_table"
 Attribute |  Type   |      Modifier
-----------+---------+--------------------
 first     | integer | not null default 0
 second    | text    |
À ce point vous décidez de changer le prompt pour quelque chose de plus intéressant :
testdb=> \set PROMPT1 '%n@%m %~%R%# '
peter@localhost testdb=>
Nous supposons que vous avez rempli la table avec des données et que vous voulez y jeter un oeil :
peter@localhost testdb=> SELECT * FROM my_table;
 first | second
-------+--------
     1 | one
     2 | two
     3 | three
     4 | four
(4 rows)
Vous pouvez donner à cette table une présentation différente en utilisant la commande \pset :
peter@localhost testdb=> \pset border 2
Border style is 2.
peter@localhost testdb=> SELECT * FROM my_table;
+-------+--------+
| first | second |
+-------+--------+
|     1 | one    |
|     2 | two    |
|     3 | three  |
|     4 | four   |
+-------+--------+
(4 rows)

peter@localhost testdb=> \pset border 0
Border style is 0.
peter@localhost testdb=> SELECT * FROM my_table;
first second
----- ------
    1 one
    2 two
    3 three
    4 four
(4 rows)

peter@localhost testdb=> \pset border 1
Border style is 1.
peter@localhost testdb=> \pset format unaligned
Output format is unaligned.
peter@localhost testdb=> \pset fieldsep ","
Field separator is ",".
peter@localhost testdb=> \pset tuples_only
Showing only tuples.
peter@localhost testdb=> SELECT second, first FROM my_table;
one,1
two,2
three,3
four,4
Alternatively, use the short commands:
peter@localhost testdb=> \a \t \x
Output format is aligned.
Tuples only is off.
Expanded display is on.
peter@localhost testdb=> SELECT * FROM my_table;
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

Annexes

Bugs et versions