psql
è il front-end a riga di comando di PostgreSQL. Questa pagina descrive i comandi psql
supportati dall'interfaccia PostgreSQL per Spanner. Per scoprire come collegarti con psql
, consulta Connessione di psql a un database in dialetto PostgreSQL.
Metacomandi
L'interfaccia PostgreSQL supporta le seguenti categorie di metacomandi psql
:
- Generale
- Guida
- Buffer delle query
- Input/Output
- Condizionale
- Informativo (solo alcuni comandi \d)
- Formattazione
- Sistema operativo
- Variabili
Le seguenti categorie non sono supportate:
- Connessione
- Oggetti di grandi dimensioni
Sono supportati i seguenti comandi informativi:
Comando | Descrizione |
---|---|
\d | Elenca tabelle (escluse le tabelle di sistema) |
\d table | Elenca le colonne della tabella |
\dt | Elenca le tabelle in tutti gli schemi (dettagliato) |
\dt table | Tabella dell'elenco (dettagliata) |
\dn | Elenca schemi |
Dichiarazioni di gestione della sessione
psql
comunica con Spanner tramite PGAdapter, che utilizza il motore di base del driver JDBC di Spanner. Il driver supporta le istruzioni di gestione della sessione descritte in Istruzioni di gestione della sessione.
Pertanto, puoi utilizzare queste istruzioni con psql
.
Raggruppamento di istruzione SQL
psql
e PGAdapter supportano batch SQL con più istruzioni. Per eseguire batch di istruzioni, utilizza
l'opzione psql -c
. Questa opzione consente di passare come singola richiesta di esecuzione uno o più comandi SQL o di gestione della sessione separati da punto e virgola (;).
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 transazioni implicite. I blocchi di transazioni implicite vengono chiusi automaticamente alla fine del batch. Se si verificano errori all'interno di un blocco di transazioni implicite, 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 batch 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 seguente mostra come eseguire gli statement SQL nel file insert_contacts.sql
.
psql -h localhost -c "$(cat contacts_insert.sql)"
DDL
Questo esempio invia un batch 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 l'importazione dei dati
Utilizza il comando COPY FROM STDIN
per importare i dati da un file di testo o CSV in un database in dialetto PostgreSQL. Sebbene sia supportato solo STDIN, puoi eseguire l'importazione utilizzando COPY
inviando i file a psql
tramite pipe.
Esistono due modi per eseguire il comando COPY
:
Atomic
COPY
I dati vengono copiati in una singola transazione. Questa è l'impostazione predefinita. Alla transazione si applicano i limiti di transazioni standard di Spanner. Ciò significa che in un'operazione
COPY
possono essere incluse al massimo 80.000 mutazioni o 100 MB di dati.Non atomico
COPY
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 l'esecuzione di
COPY
e l'operazione viene interrotta, alcune righe potrebbero essere già state memorizzate nel database. Non viene eseguito alcun rollback. Le transazioni vengono eseguite in parallelo, pertanto i dati dopo la riga nel file di importazione che ha causato l'errore potrebbero essere importati nel database prima dell'interruzione dell'operazioneCOPY
.
Attiva COPY
non atomico
Per attivare COPY
non atomico, invia il seguente comando 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 esistere già. 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 a 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 null. Il valore predefinito è \N (barra sinistra + 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 null dalle stringhe vuote.
QUOTE
specifica il carattere di virgolette da utilizzare quando un valore di dati è tra virgolette. Il valore predefinito è le virgolette doppie. Deve essere un singolo carattere di un byte. Questa opzione è consentita solo se utilizzi il formato CSV.
ESCAPE
specifica il carattere da visualizzare prima di un carattere di dati che corrisponde al valore QUOTE
. Il valore predefinito è uguale al valore QUOTE
(in modo che il carattere di virgolette venga raddoppiato se compare nei dati). Deve essere un singolo carattere di un byte. Questa opzione è consentita solo se utilizzi 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 testo denominato mydata.txt
nella tabella mytable
. PGAdapter deve essere in esecuzione. Per ulteriori informazioni, consulta Avvio di PGAdapter.
cat mydata.txt | psql -h localhost -c "COPY mytable FROM STDIN;"
In questo altro esempio, mydata.csv
è in formato CSV e la prima riga è un'intestazione con nomi di colonna separati da virgola.
cat mydata.csv | psql -h localhost \
-c "COPY mytable FROM STDIN WITH (FORMAT csv, ESCAPE '~', HEADER TRUE);"
L'esempio seguente 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 contiene una riga di intestazione con i nomi delle colonne e non è stata specificata l'opzione HEADER
.
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 del file di input non include un valore (o null) per ogni colonna della tabella. Una causa potrebbe essere un file CSV con formato non corretto o una mancata corrispondenza tra l'opzione di delimitatore specificata (o il delimitatore predefinito) e il delimitatore effettivo nel file.
Passaggi successivi
- Scopri come connetterti a un database con il dialetto PostgreSQL con
psql
. - Scopri di più su PGAdapter.