Outil de ligne de commande psql

psql est l'interface de ligne de commande pour PostgreSQL. Cette page décrit les commandes psql compatibles avec l'interface PostgreSQL pour Spanner. Pour découvrir comment établir la connexion avec psql, consultez la section Connecter psql à une base de données PostgreSQL.

Commandes Meta

L'interface PostgreSQL accepte les catégories de méta-commandes psql suivantes:

  • Général
  • Aide
  • Tampon de requête
  • Input/Output
  • Conditional
  • À titre informatif (certaines commandes \d uniquement)
  • Mise en forme
  • Système d'exploitation
  • Variables

Les catégories suivantes ne sont pas acceptées:

  • Connexion
  • Objets volumineux

Les commandes informatives suivantes sont acceptées:

Commande Description
\d Répertorier les tables (à l'exclusion des tables système)
\d table Répertorier les colonnes d'une table
\dt Répertorier les tables de tous les schémas (en détail)
\dt table Répertorier les tables (en détail)
\dn Lister les schémas

Instructions de gestion de session

psql communique avec Spanner via PGAdapter, qui utilise le moteur principal du pilote JDBC Spanner. Le pilote est compatible avec les instructions de gestion des sessions décrites dans la section Instructions de gestion des sessions. Vous pouvez donc utiliser ces instructions avec psql.

Traitement par lot des instructions SQL

psql et PGAdapter acceptent les lots SQL à plusieurs instructions. Pour effectuer des instructions par lot, utilisez l'option psql -c. Cette option permet de transmettre une ou plusieurs instructions SQL ou de gestion de session, séparées par un point-virgule (;), en une seule requête d'exécution. Un lot peut inclure toutes les instructions compatibles et peut combiner des instructions LDD, LMD et DQL.

Un lot de plusieurs instructions est exécuté dans un seul bloc de transaction implicite. Les blocs de transactions implicites sont automatiquement fermés à la fin du lot. Si des erreurs se produisent à l'intérieur d'un bloc de transaction implicite, l'ensemble de la transaction est annulé.

Les contrôles de transaction BEGIN et COMMIT explicites sont acceptés, mais un bloc de transaction explicite ne peut pas contenir d'instructions LDD.

Examples

LMD

L'exemple suivant montre comment envoyer un lot d'instructions INSERT.

psql -h localhost -p 5432 -c "INSERT INTO users (id, age, firstname) VALUES (1, 25, 'Alex'); \
 INSERT INTO users (id, age, firstname) VALUES (2, 31, 'Dana'); \
 INSERT INTO users (id, age, firstname) VALUES (3, 54, 'Izumi');"

L'exemple suivant montre comment exécuter les instructions SQL dans le fichier insert_contacts.sql.

psql -h localhost -c "$(cat contacts_insert.sql)"

LDD

Cet exemple envoie un lot d'instructions ALTER TABLE.

psql -h localhost -p 5432 test-db -c "ALTER TABLE users ADD col1 integer; \
 ALTER TABLE users ADD col2 text; ALTER TABLE users ADD col3 float8;"

Commande COPY pour l'importation de données

Utilisez la commande COPY FROM STDIN pour importer des données à partir d'un fichier texte ou CSV dans une base de données de dialecte PostgreSQL. Bien que seul STDIN soit compatible, vous pouvez importer les données à l'aide de COPY en redirigeant les fichiers vers psql.

Il existe deux façons d'exécuter la commande COPY:

  • Atomique COPY

    Les données sont copiées en une seule transaction. Il s'agit de l'option par défaut. Les limites de transaction standards de Spanner s'appliquent aux transactions. Cela signifie qu'un maximum de 80 000 mutations ou 100 Mo de données peuvent être inclus en une seule opération COPY.

  • COPY non atomique

    COPY répartit automatiquement les données sur plusieurs transactions si le fichier contient plus de 80 000 mutations ou plus de 100 Mo.

    Si une erreur se produit pendant l'opération COPY et que l'opération est annulée, il est possible que certaines lignes soient déjà conservées dans la base de données. Aucun rollback n'est effectué. Les transactions sont exécutées en parallèle. Par conséquent, les données situées après la ligne du fichier d'importation qui a causé l'erreur peuvent être importées dans la base de données avant l'arrêt de l'opération COPY.

Activer les COPY non atomiques

Pour activer l'COPY non atomique, exécutez la commande suivante avant d'exécuter l'opération de copie.

SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'

Syntaxe

COPY table_name [ ( column_name [, ...] ) ]
    FROM STDIN
    [ [ WITH ] ( option [, ...] ) ]

where option is one of:

    FORMAT format_name
    DELIMITER 'delimiter_character'
    NULL 'null_string'
    QUOTE 'quote_character'
    ESCAPE 'escape_character'
    HEADER [boolean]

and format_name is:
    {text|csv}

and delimiter_character is:
    [!-~] except ' " \

and null_string is:
    {a—z|A—Z|0—9|_}+

and quote_character is:
    [!-~] except ' " \

and escape_character is:
    [!-~] except ' " \

and boolean is:
    {TRUE|ON|1|FALSE|OFF|0}

Le tableau doit déjà exister. Si aucune liste de colonnes n'est spécifiée, toutes les colonnes de la table sont copiées.

La valeur par défaut pour FORMAT est text.

delimiter_character doit être un caractère codé sur un octet. La valeur par défaut est le caractère de tabulation pour le format texte et une virgule pour le format CSV.

NULL spécifie la chaîne représentant une valeur nulle. La valeur par défaut est \N (barre oblique inverse + N) au format texte et une chaîne vide sans guillemets au format CSV. Vous pouvez préférer une chaîne vide, même au format texte, dans les cas où vous ne souhaitez pas distinguer les valeurs Null des chaînes vides.

QUOTE spécifie le caractère de guillemet à utiliser lorsqu'une valeur de données est placée entre guillemets. La valeur par défaut est le guillemet double. Il doit s'agir d'un caractère codé sur un seul octet. Cette option n'est autorisée que si vous utilisez le format CSV.

ESCAPE spécifie le caractère à afficher avant un caractère de données qui correspond à la valeur QUOTE. La valeur par défaut est identique à celle de QUOTE (de sorte que le guillemet est doublé s'il apparaît dans les données). Il doit s'agir d'un caractère codé sur un seul octet. Cette option n'est autorisée que si vous utilisez le format CSV.

HEADER indique si le premier enregistrement du fichier d'entrée est un en-tête (contient des noms de colonnes). La valeur par défaut est TRUE.

Examples

Cet exemple importe les données du fichier au format texte nommé mydata.txt dans la table mytable. PGAdapter doit être en cours d'exécution. Pour en savoir plus, consultez la section Démarrer PGAdapter.

cat mydata.txt | psql -h localhost -c "COPY mytable FROM STDIN;"

Dans l'exemple suivant, mydata.csv est au format CSV, et sa première ligne est un en-tête avec des noms de colonnes séparés par des virgules.

cat mydata.csv | psql -h localhost \
  -c "COPY mytable FROM STDIN WITH (FORMAT csv, ESCAPE '~', HEADER TRUE);"

L'exemple suivant montre comment démarrer une opération COPY non atomique.

cat mydata.txt | psql -h localhost \
  -c "SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'" -c "COPY mytable FROM STDIN;"

Dépannage

Voici quelques erreurs courantes.

Syntaxe de saisie incorrecte

L'erreur suivante se produit :

Invalid input syntax for type <type>:"<table_name>"

Cette erreur peut se produire lorsque le fichier d'entrée comporte une ligne d'en-tête avec des noms de colonnes et que l'option HEADER n'a pas été spécifiée.

Données COPY incorrectes

L'erreur suivante se produit :

Invalid COPY data: Row length mismatched. Expected <number> columns, but only found <number>

Cette erreur se produit lorsqu'une ligne du fichier d'entrée n'inclut pas de valeur (ou "null") pour chaque colonne de la table. Cela peut être dû à un fichier CSV mal formé ou à une non-concordance entre l'option de délimiteur spécifiée (ou le délimiteur par défaut) et le délimiteur réel du fichier.

Étapes suivantes