Strumento a riga di comando psql

psql è il front-end della riga di comando di PostgreSQL. In questa pagina vengono descritti i comandi psql supportati dall'interfaccia PostgreSQL per Spanner. Per scoprire come connetterti a psql, consulta Connessione di psql a un database dialetto PostgreSQL.

Metacomandi

L'interfaccia PostgreSQL supporta le seguenti categorie di meta-comandi psql:

  • Generico
  • Guida
  • Buffer di query
  • Ingresso/uscita
  • Condizionali
  • Informative (solo alcuni comandi \d)
  • Formattazione
  • Sistema operativo
  • Variabili

Le seguenti categorie non sono supportate:

  • Connection
  • Oggetti di grandi dimensioni

Sono supportati i seguenti comandi informativi:

Comando Descrizione
\d Elenca tabelle (escluse le tabelle di sistema)
\g table Elenco colonne tabella
\dt Elenco delle tabelle in tutti gli schemi (dettagliato)
\dt table Tabella elenco (dettagliata)
\ n Elenca schemi

Istruzioni per la gestione delle sessioni

psql comunica con Spanner tramite PGAdapter, che utilizza il motore principale del driver JDBC di Spanner. Il driver supporta le istruzioni di gestione delle sessioni descritte in Istruzioni di gestione delle sessioni. Di conseguenza, puoi utilizzare queste istruzioni con psql.

Raggruppamento di istruzione SQL

psql e PGAdapter supportano batch SQL con più istruzioni. Per raggruppare le istruzioni, utilizza l'opzione psql -c. Questa opzione consente di passare una o più istruzioni di gestione delle sessioni o SQL, separate da punto e virgola (;), come singola richiesta di esecuzione. Un batch può includere qualsiasi istruzione supportata e può combinare DDL, DML e DQL.

Un batch con più istruzioni viene eseguito all'interno di un singolo blocco di transazione implicita. I blocchi delle transazioni implicite vengono chiusi automaticamente al termine del batch. Se si verificano errori all'interno di un blocco di transazione implicito, viene eseguito il rollback dell'intera transazione.

I controlli delle transazioni BEGIN e COMMIT espliciti sono supportati, ma un blocco di transazioni esplicito non può contenere istruzioni DDL.

Esempi

DML

L'esempio seguente mostra come inviare un gruppo di istruzioni 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'esempio successivo mostra come eseguire le istruzioni SQL nel file insert_contacts.sql.

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

DDL

Questo esempio invia un gruppo di istruzioni 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;"

Comando COPY per importare i dati

Utilizza il comando COPY FROM STDIN per importare i dati da un file di testo o CSV in un database dialetto PostgreSQL. Anche se è supportato soltanto il formato STDIN, puoi eseguire l'importazione utilizzando COPY pizzicando i file in psql.

Esistono due modi per eseguire il comando COPY:

  • Atomico COPY

    I dati vengono copiati in una singola transazione. Questa è l'impostazione predefinita. Alla transazione si applicano i limiti standard di Spanner. Ciò significa che in un'operazione COPY possono essere inclusi al massimo 80.000 mutazioni o 100 MB di dati.

  • COPY non atomico

    COPY suddivide automaticamente i dati in più transazioni se il file contiene più di 80.000 mutazioni o più di 100 MB.

    Se si verifica un errore durante COPY e l'operazione viene interrotta, alcune righe potrebbero essere già state create come persistenti nel database. Non viene eseguito alcun rollback. Le transazioni vengono eseguite in parallelo, quindi i dati successivi alla riga del file di importazione che ha causato l'errore potrebbero essere importati nel database prima dell'interruzione dell'operazione COPY.

Abilita COPY non atomico

Per abilitare COPY non atomico, invia il comando seguente prima di eseguire l'operazione di copia.

SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'

Sintassi

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}

La tabella deve già esistere. Se non viene specificato alcun elenco di colonne, vengono copiate tutte le colonne della tabella.

Il valore predefinito per FORMAT è text.

delimiter_character deve essere un carattere da un byte. Il valore predefinito è il carattere Tab per il formato di testo e una virgola per il formato CSV.

NULL specifica la stringa che rappresenta un valore nullo. Il valore predefinito è \N (barra rovesciata+N) in formato di testo e una stringa vuota senza virgolette in formato CSV. Potresti preferire una stringa vuota anche in formato di testo nei casi in cui non vuoi distinguere i valori nulli dalle stringhe vuote.

QUOTE specifica il carattere di citazione da utilizzare quando un valore dei dati viene tra virgolette. L'impostazione predefinita è le virgolette doppie. Deve essere un singolo carattere da un byte. Questa opzione è consentita solo quando si utilizza il formato CSV.

ESCAPE specifica il carattere da visualizzare prima di un carattere dei dati che corrisponde al valore QUOTE. Il valore predefinito corrisponde al valore di QUOTE (quindi il carattere di citazione viene raddoppiato se viene visualizzato nei dati). Deve essere un singolo carattere da un byte. Questa opzione è consentita solo quando si utilizza il formato CSV.

HEADER indica se il primo record del file di input è un'intestazione (contiene i nomi delle colonne). Il valore predefinito è TRUE.

Esempi

Questo esempio importa i dati dal file in formato di testo denominato mydata.txt nella tabella mytable. PGAdapter deve essere in esecuzione. Per ulteriori informazioni, consulta la sezione Avviare PGAdapter.

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

Nel prossimo esempio, mydata.csv è in formato CSV e la sua prima riga è un'intestazione con nomi di colonna separati da virgole.

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

Il prossimo esempio mostra come avviare un'operazione COPY non atomica.

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

Risoluzione dei problemi

Di seguito sono riportati alcuni errori comuni.

Sintassi di input non valida

Si verifica il seguente errore:

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

Questo errore può verificarsi quando il file di input ha una riga di intestazione con i nomi delle colonne e l'opzione HEADER non è stata specificata.

Dati COPY non validi

Si verifica il seguente errore:

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

Questo errore si verifica quando una riga nel file di input non include un valore (o null) per ogni colonna della tabella. Una delle cause potrebbe essere un file CSV non corretto o una mancata corrispondenza tra l'opzione del delimitatore specificata (o il delimitatore predefinito) e il delimitatore effettivo nel file.

Passaggi successivi