psql
é o front-end de linha de comando do PostgreSQL. Nesta página, descrevemos a política de psql
compatíveis com a Interface PostgreSQL para o Spanner. Para saber como
conectar com psql
ver
Como conectar psql a um banco de dados de dialetos PostgreSQL.
Metacomandos
A interface PostgreSQL é compatível com as seguintes categorias de metacomandos psql
:
- Geral
- Ajuda
- Buffer de consulta
- Entrada/Saída
- Condicional
- Informativo (somente alguns comandos \d)
- Formatação
- Sistema operacional
- Variáveis
As seguintes categorias não são compatíveis:
- Conexão
- Objetos grandes
Os comandos informativos a seguir são compatíveis:
Comando | Descrição |
---|---|
\d | Listar tabelas (excluindo tabelas do sistema) |
\d table | Listar colunas da tabela |
\dt | Listar tabelas em todos os esquemas (detalhado) |
\dt table | Tabela de listas (detalhada) |
\dn | Listar esquemas |
Instruções de gerenciamento de sessão
psql
se comunica com o Spanner por meio do PGAdapter.
que usa o mecanismo principal do driver JDBC do Spanner. O motorista
suporta as instruções de gerenciamento de sessão descritas em
Instruções de gerenciamento de sessão.
Portanto, é possível usar essas instruções com psql
.
Lotes de instrução SQL
psql
e PGAdapter são compatíveis com lotes SQL de várias instruções. Para instruções em lote, use
a opção psql -c
. Essa opção permite um ou mais SQL ou gerenciamento de sessão
instruções, separadas por ponto e vírgula (;), a serem passadas como uma única solicitação de execução.
Um lote pode incluir qualquer instrução compatível e misturar DDL, DML e DQL.
Um lote com várias instruções é executado em um único bloco de transação implícita. Blocos de transação implícitas são fechados automaticamente no final do lote. Se ocorrer algum erro dentro de um bloco de transação implícita, toda a transação é revertida.
BEGIN
e
Os controles de transação COMMIT
são compatíveis, mas um bloco de transação explícito
não pode conter instruções DDL.
Exemplos
DML
O exemplo a seguir mostra como enviar um lote de instruções 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');"
O próximo exemplo mostra como executar as instruções SQL no arquivo insert_contacts.sql
.
psql -h localhost -c "$(cat contacts_insert.sql)"
DDL
Este exemplo envia um lote de instruções 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 para importar dados
Use o comando COPY FROM STDIN
para importar dados de um arquivo CSV ou de texto para o
um banco de dados de dialeto PostgreSQL. Embora apenas o STDIN seja compatível, você pode importar usando COPY
encadeando arquivos para psql
.
Há duas maneiras de executar o comando COPY
:
Atômico
COPY
Os dados são copiados em uma única transação. Esse é o padrão. Limites de transação padrão de O Spanner é aplicado à transação. Isso significa que no máximo 80.000 mutações ou 100 MB de dados podem ser incluídos em uma operação
COPY
.COPY
não atômicoO
COPY
divide automaticamente os dados em várias transações se o arquivo contiver mais de 80.000 mutações ou mais que 100 MB.Se ocorrer um erro durante a
COPY
e a operação for cancelada, algumas linhas podem já estar armazenadas no banco de dados. Nenhuma reversão vai ocorrer. As transações são executadas em paralelo, ou seja, os dados após a linha na importação arquivo que causou o erro pode ser importado para o banco de dados antes a operaçãoCOPY
for interrompida.
Ativar COPY
não atômico
Para ativar COPY
não atômico, envie o seguinte comando antes de executar a cópia
operação
SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'
Sintaxe
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}
A tabela já deve existir. Se nenhuma lista de colunas for especificada, todas as colunas da tabela serão copiadas.
O padrão para FORMAT
é text
.
delimiter_character precisa ser um caractere de um byte. O padrão é um caractere de tabulação para o formato de texto e uma vírgula para o formato CSV.
NULL
especifica a string que representa um valor nulo. O padrão é \N (barra invertida+N) no formato de texto e uma string vazia sem aspas no formato CSV. Você pode preferir uma string vazia mesmo em formato de texto para os casos em que não quer distinguir valores nulos de strings vazias.
QUOTE
especifica o caractere de aspas que será usado quando um valor de dados for citado. O padrão é aspas duplas. Precisa ser um caractere de um byte. Essa opção é permitida apenas quando o formato CSV é usado.
ESCAPE
especifica o caractere que aparece antes de um caractere de dados que corresponde ao valor QUOTE
. O padrão é o mesmo que o valor QUOTE
(de modo que o caractere de aspas seja duplicado se aparecer nos dados). Precisa ser um caractere de um byte. Essa opção é permitida apenas quando o formato CSV é usado.
HEADER
indica se o primeiro registro do arquivo de entrada é um cabeçalho (contém nomes de colunas). O padrão é TRUE.
Exemplos
Este exemplo importa dados do arquivo formatado em texto chamado mydata.txt
para a tabela mytable
. PGAdapter
precisa estar em execução. Para mais informações, consulte Como iniciar o PGAdapter.
cat mydata.txt | psql -h localhost -c "COPY mytable FROM STDIN;"
No próximo exemplo, mydata.csv
está no formato CSV, e a primeira linha é um cabeçalho com
nomes de colunas separados por vírgulas.
cat mydata.csv | psql -h localhost \
-c "COPY mytable FROM STDIN WITH (FORMAT csv, ESCAPE '~', HEADER TRUE);"
O próximo exemplo mostra como iniciar uma operação COPY
não atômica.
cat mydata.txt | psql -h localhost \
-c "SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'" -c "COPY mytable FROM STDIN;"
Solução de problemas
Veja a seguir alguns erros comuns.
Sintaxe de entrada inválida
O seguinte erro ocorre:
Invalid input syntax for type <type>:"<table_name>"
Este erro pode ocorrer quando o arquivo de entrada tem uma linha de cabeçalho com nomes de colunas e
a opção HEADER
não foi especificada.
Dados de COPY inválidos
O seguinte erro ocorre:
Invalid COPY data: Row length mismatched. Expected <number> columns, but only found <number>
Este erro ocorre quando uma linha no arquivo de entrada não inclui um valor (ou nulo) para cada coluna da tabela. Uma das causas pode ser um arquivo CSV malformado ou uma incompatibilidade entre a opção de delimitador especificado (ou delimitador padrão) e o delimitador real no arquivo.
A seguir
- Saiba como se conectar a um banco de dados de dialeto PostgreSQL com
psql
. - Saiba mais sobre o PGAdapter.