Objetivos
Neste tutorial, mostramos as seguintes etapas usando o Spanner Proxy local PGAdapter para drivers PostgreSQL:
- Crie uma instância e um banco de dados do Spanner.
- Gravar, ler e executar consultas SQL em dados contidos no banco de dados.
- Atualizar o esquema do banco de dados.
- Atualizar dados usando uma transação de leitura e gravação.
- Adicionar um índice secundário ao banco de dados.
- Usar o índice para ler e executar consultas SQL nos dados.
- Recuperar dados usando uma transação somente leitura.
Custos
Neste tutorial, usamos o Spanner, que é um componente faturável da Google Cloud. Para mais informações sobre o custo do uso do Spanner, consulte Preços.
Antes de começar
Conclua as etapas descritas em Configurar, que abrangem a criação e a configuração de um projeto padrão do Google Cloud, o faturamento, a API Cloud Spanner e a configuração do OAuth 2.0 para receber credenciais de autenticação para usar a API Cloud Spanner.
Especificamente, execute gcloud auth
application-default login
para configurar o ambiente de desenvolvimento local com credenciais de autenticação.
Preparar o ambiente PGAdapter local
É possível usar drivers PostgreSQL em combinação com o PGAdapter para se conectar ao Spanner. O PGAdapter é um proxy local que converte o protocolo de rede do PostgreSQL no protocolo gRPC do Spanner.
O PGAdapter exige o Java ou o Docker para funcionar.
Instale um dos seguintes itens na sua máquina de desenvolvimento, se nenhum deles já estiver instalado:
- Java 8 JDK (fazer o download).
- Docker (download).
Clone o repositório do app de amostra na máquina local:
git clone https://github.com/GoogleCloudPlatform/pgadapter.git
Mude para o diretório que contém o exemplo de código do Spanner:
psql
cd pgadapter/samples/snippets/psql-snippets
Java
cd pgadapter/samples/snippets/java-snippets mvn package -DskipTests
Go
cd pgadapter/samples/snippets/golang-snippets
Node.js
cd pgadapter/samples/snippets/nodejs-snippets npm install
Python
cd pgadapter/samples/snippets/python-snippets python -m venv ./venv pip install -r requirements.txt cd samples
C#
cd pgadapter/samples/snippets/dotnet-snippets
Criar uma instância
Ao usar o Spanner pela primeira vez, é necessário criar uma instância, que é uma alocação de recursos usados pelos bancos de dados do Spanner. Ao criar uma instância, escolha uma configuração que determine onde os dados serão armazenados e também o número de nós a serem usados. Isso determina a quantidade de recursos de exibição e armazenamento na instância.
Execute o seguinte comando para criar uma instância do Spanner na região
us-central1
com 1 nó:
gcloud spanner instances create test-instance --config=regional-us-central1 \
--description="Test Instance" --nodes=1
A instância criada tem as seguintes características:
- Código da instância:
test-instance
- Nome de exibição:
Test Instance
- Configuração da instância:
regional-us-central1
as configurações regionais armazenam dados em uma região, enquanto as configurações multirregionais distribuem dados em várias regiões. Para mais informações, consulte Sobre as instâncias. - Um nó
node_count
corresponde à quantidade de recursos de exibição e armazenamento disponíveis aos bancos de dados na instância. Saiba mais em Nós e unidades de processamento.
Você verá:
Creating instance...done.
Consultar os arquivos de amostra
O repositório de amostras contém um exemplo que mostra como usar o Spanner com o PGAdapter.
Dê uma olhada na pastasamples/snippets
, que mostra como usar
no Spanner. O código mostra como criar e usar um novo banco de dados. Os dados usam o esquema de exemplo exibido na página Esquema e modelo de dados.
Iniciar PGAdapter
Inicie o PGAdapter na sua máquina de desenvolvimento local e aponte-o para o que você criou.
Os comandos a seguir pressupõem que você tenha executado
gcloud auth application-default login
.
Aplicativo do Java
wget https://storage.googleapis.com/pgadapter-jar-releases/pgadapter.tar.gz \
&& tar -xzvf pgadapter.tar.gz
java -jar pgadapter.jar -i test-instance
Docker
docker pull gcr.io/cloud-spanner-pg-adapter/pgadapter
docker run \
--name pgadapter \
--rm -d -p 5432:5432 \
-v "$HOME/.config/gcloud":/gcloud:ro \
--env CLOUDSDK_CONFIG=/gcloud \
gcr.io/cloud-spanner-pg-adapter/pgadapter \
-i test-instance -x
Emulador
docker pull gcr.io/cloud-spanner-pg-adapter/pgadapter-emulator
docker run \
--name pgadapter-emulator \
--rm -d \
-p 5432:5432 \
-p 9010:9010 \
-p 9020:9020 \
gcr.io/cloud-spanner-pg-adapter/pgadapter-emulator
Isso inicia o PGAdapter com um Spanner incorporado emulador. Esse emulador incorporado cria automaticamente qualquer instância ou banco de dados do Spanner a que você se conecta sem precisar criá-los manualmente.
Recomendamos que você execute o PGAdapter em produção como um contêiner side-car ou como uma dependência em processo. Para mais informações sobre implantação PGAdapter em produção. Consulte Escolha um método para executar o PGAdapter.
Criar um banco de dados
Crie um banco de dados com o nome example-db
na instância com o nome test-instance
ao
executando o seguinte na linha de comando:
gcloud spanner databases create example-db --instance=test-instance \
--database-dialect=POSTGRESQL
Você verá:
Creating database...done.
crie tabelas
O código a seguir cria duas tabelas no banco de dados.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./create_tables.sh example-db
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar createtables example-db
Go
go run sample_runner.go createtables example-db
Node.js
npm start createtables example-db
Python
python create_tables.py example-db
C#
dotnet run createtables example-db
O próximo passo é gravar dados no seu banco de dados.
Crie uma conexão
Antes de fazer leituras ou gravações, é necessário criar uma conexão com o PGAdapter. Todas as suas interações com o Spanner precisam passar por umConnection
. O nome do banco de dados é especificado na string de conexão.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./create_connection.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar createconnection example-db
Go
go run sample_runner.go createconnection example-db
Node.js
npm start createconnection example-db
Python
python create_connection.py example-db
C#
dotnet run createconnection example-db
Gravar dados com DML
É possível inserir dados usando a linguagem de manipulação de dados (DML, na sigla em inglês) em uma transação de leitura/gravação.
Estes exemplos mostram como executar uma instrução DML no Spanner usando um driver do PostgreSQL.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./write_data_with_dml.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar writeusingdml example-db
Go
go run sample_runner.go writeusingdml example-db
Node.js
npm start writeusingdml example-db
Python
python write_data_with_dml.py example-db
C#
dotnet run writeusingdml example-db
Você verá a seguinte resposta:
4 records inserted.
Gravar dados com um lote DML
O PGAdapter oferece suporte à execução de lotes DML. Enviar várias DML de ida e volta em um lote reduz o número de viagens de ida e volta para no Spanner e melhora o desempenho do aplicativo.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./write_data_with_dml_batch.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar writeusingdmlbatch example-db
Go
go run sample_runner.go writeusingdmlbatch example-db
Node.js
npm start writeusingdmlbatch example-db
Python
python write_data_with_dml_batch.py example-db
C#
dotnet run writeusingdmlbatch example-db
Você verá:
3 records inserted.
Gravar dados com mutações
Também é possível inserir dados usando mutações.
O PGAdapter traduz o comando COPY
do PostgreSQL em
mutações. Usar COPY
é a maneira mais eficiente de inserir dados rapidamente no
banco de dados do Spanner.
As operações COPY
são atômicas por padrão. Operações atômicas no
O Spanner está vinculado ao limite de tamanho de confirmação.
Para mais informações, consulte Limite de CRUD.
Estes exemplos mostram como executar uma operação COPY
não atômica. Isso permite
que a operação COPY
exceda o limite de tamanho de confirmação.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./write_data_with_copy.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar write example-db
Go
go run sample_runner.go write example-db
Node.js
npm start write example-db
Python
python write_data_with_copy.py example-db
C#
dotnet run write example-db
Você verá:
Copied 5 singers
Copied 5 albums
Consultar dados usando SQL
O Spanner oferece suporte a uma interface SQL para leitura de dados, que pode ser acessada na linha de comando usando a CLI do Google Cloud ou programaticamente usando um driver do PostgreSQL.
Na linha de comando
Execute a instrução SQL a seguir para ler os valores de todas as colunas da tabela Albums
:
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT singer_id, album_id, album_title FROM albums'
O resultado será:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Usar um driver do PostgreSQL
Além de executar uma instrução SQL na linha de comando, é possível emitir a mesma instrução SQL de maneira programática usando um driver do PostgreSQL.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./query_data.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar query example-db
Go
go run sample_runner.go query example-db
Node.js
npm start query example-db
Python
python query_data.py example-db
C#
dotnet run query example-db
Você verá o seguinte resultado:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Consulta usando um parâmetro SQL
Se seu aplicativo tiver uma consulta executada com frequência, você poderá melhorar seu desempenho ao parametrizar-o. A consulta paramétrica resultante pode ser armazenada em cache e reutilizada, o que reduz os custos de compilação. Para mais informações, consulte Use parâmetros de consulta para acelerar as consultas executadas com frequência.
Confira um exemplo de como usar um parâmetro na cláusula WHERE
para
consultar registros que contêm um valor específico para LastName
.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./query_data_with_parameter.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar querywithparameter example-db
Go
go run sample_runner.go querywithparameter example-db
Node.js
npm start querywithparameter example-db
Python
python query_data_with_parameter.py example-db
C#
dotnet run querywithparameter example-db
Você verá o seguinte resultado:
12 Melissa Garcia
Atualizar o esquema do banco de dados
Suponha que você precise adicionar uma nova coluna denominada MarketingBudget
à tabela Albums
. Para isso, é necessário atualizar seu esquema de banco de dados. O Spanner oferece suporte a atualizações de esquema em um banco de dados enquanto esse banco
continua a veicular o tráfego. As atualizações de esquema não exigem
banco de dados off-line e não bloqueiam tabelas ou colunas inteiras. você pode continuar
gravação de dados no banco de dados durante a atualização do esquema. Leia mais sobre os recursos
e o desempenho das alterações de esquema
Faça atualizações de esquema.
Adicionar uma coluna
É possível adicionar uma coluna na linha de comando usando a Google Cloud CLI ou programaticamente usando e usar um driver PostgreSQL.
Na linha de comando
Use o seguinte comando ALTER TABLE
para adicionar a nova coluna à tabela:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE albums ADD COLUMN marketing_budget BIGINT'
Você verá:
Schema updating...done.
Usar um driver do PostgreSQL
Execute a instrução DDL usando um driver do PostgreSQL para modificar o esquema:
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./add_column.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar addmarketingbudget example-db
Go
go run sample_runner.go addmarketingbudget example-db
Node.js
npm start addmarketingbudget example-db
Python
python add_column.py example-db
C#
dotnet run addmarketingbudget example-db
Você verá:
Added marketing_budget column
Executar um lote de DDL
É recomendável executar várias modificações de esquema em um lote.
É possível executar várias instruções DDL em um lote usando o
de lote do driver do PostgreSQL enviando todos os arquivos DDL
como uma string SQL separada por ponto e vírgula ou usando o prefixo
instruções START BATCH DDL
e RUN BATCH
.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./ddl_batch.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar ddlbatch example-db
Go
go run sample_runner.go ddlbatch example-db
Node.js
npm start ddlbatch example-db
Python
python ddl_batch.py example-db
C#
dotnet run ddlbatch example-db
Você verá:
Added venues and concerts tables
Gravar dados na nova coluna
O código a seguir grava dados na coluna nova. Ele define MarketingBudget
como 100000
para a linha indexada por Albums(1, 1)
e como 500000
para a linha indexada por Albums(2, 2)
.
COPY
do PostgreSQL em
mutações. Por padrão, os comandos COPY
são convertidos em mutações Insert
.
Execute set spanner.copy_upsert=true
para traduzir comandos COPY
para
InsertOrUpdate
. Isso pode ser usado para atualizar dados existentes no
Spanner.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./update_data_with_copy.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar update example-db
Go
go run sample_runner.go update example-db
Node.js
npm start update example-db
Python
python update_data_with_copy.py example-db
C#
dotnet run update example-db
Você verá:
Updated 2 albums
Você também pode executar uma consulta SQL para buscar os valores que acabou de gravar.
Veja a seguir o código para executar a consulta:
psql
Java
Go
Node.js
Python
C#
Execute a consulta com este comando:
psql
PGDATABASE=example-db ./query_data_with_new_column.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar querymarketingbudget example-db
Go
go run sample_runner.go querymarketingbudget example-db
Node.js
npm start querymarketingbudget example-db
Python
python query_data_with_new_column.py example-db
C#
dotnet run querymarketingbudget example-db
Você verá:
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
Atualizar dados
É possível atualizar dados usando DML em uma transação de leitura/gravação.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./update_data_with_transaction.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar writewithtransactionusingdml example-db
Go
go run sample_runner.go writewithtransactionusingdml example-db
Node.js
npm start writewithtransactionusingdml example-db
Python
python update_data_with_transaction.py example-db
C#
dotnet run writewithtransactionusingdml example-db
Você verá:
Transferred marketing budget from Album 2 to Album 1
Tags de transação e de solicitação
Use tags de transação e de solicitação
para resolver problemas com transações e consultas no Spanner. É possível definir
tags de transação e tags de solicitação com as variáveis de sessão SPANNER.TRANSACTION_TAG
e
SPANNER.STATEMENT_TAG
.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./tags.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar tags example-db
Go
go run sample_runner.go tags example-db
Node.js
npm start tags example-db
Python
python tags.py example-db
C#
dotnet run tags example-db
Recuperar dados usando transações somente leitura
Suponha que você queira executar mais de uma leitura no mesmo carimbo de data/hora. As transações somente leitura observam um prefixo consistente do histórico de confirmações da transação. Portanto, o aplicativo sempre recebe dados consistentes.
Defina a conexão como somente leitura ou use a instrução SQL SET TRANSACTION READ ONLY
para executar uma transação somente leitura.
Veja a seguir como executar uma consulta e fazer uma leitura na mesma transação somente leitura.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./read_only_transaction.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar readonlytransaction example-db
Go
go run sample_runner.go readonlytransaction example-db
Node.js
npm start readonlytransaction example-db
Python
python read_only_transaction.py example-db
C#
dotnet run readonlytransaction example-db
Você verá uma saída como:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
2 2 Forever Hold Your Peace
1 2 Go, Go, Go
2 1 Green
2 3 Terrified
1 1 Total Junk
Consultas particionadas e Data Boost
A API partitionQuery
divide uma consulta em partes menores, ou partições, e usa várias
máquinas para buscar as partições em paralelo. Cada partição é identificada por um
token de partição. A API PartitionQuery tem uma latência maior do que a API de consulta
padrão, porque é destinada apenas a operações em massa, como exportar ou
procurar todo o banco de dados.
O Data Boost permite executar consultas de análise e exportações de dados com impacto quase zero nas cargas de trabalho atuais na instância provisionada do Spanner. O Data Boost só é compatível com consultas particionadas.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./data_boost.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar databoost example-db
Go
go run sample_runner.go databoost example-db
Node.js
npm start databoost example-db
Python
python data_boost.py example-db
C#
dotnet run databoost example-db
Para mais informações sobre como executar consultas particionadas e usar o Data Boost com PGAdapter, consulte: Otimização de dados e instruções de consulta particionada
DML particionada
A linguagem de manipulação de dados (DML) particionada foi projetada para os seguintes tipos de atualizações e exclusões em massa:
- Limpeza periódica e coleta de lixo.
- Preenchimento de novas colunas com valores padrão.
psql
Java
Go
Node.js
Python
C#
Execute o exemplo com o seguinte comando:
psql
PGDATABASE=example-db ./partitioned_dml.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar partitioneddml example-db
Go
go run sample_runner.go partitioneddml example-db
Node.js
npm start partitioneddml example-db
Python
python partitioned_dml.py example-db
C#
dotnet run datpartitioneddmlboost example-db
Limpeza
Para não gerar cobranças extras na sua conta do Google Cloud pelos recursos usados neste tutorial, suspenda o banco de dados e exclua a instância que você criou.
Excluir o banco de dados
Se você excluir uma instância, todos os bancos de dados nela serão excluídos automaticamente. Nesta etapa, mostramos como excluir um banco de dados sem remover a instância. Ainda pode haver cobrança em relação à instância.
Na linha de comando
gcloud spanner databases delete example-db --instance=test-instance
Use o console do Google Cloud
Acesse a página Instâncias do Spanner no console do Google Cloud.
Clique na instância.
Clique no banco de dados que você quer excluir.
Na página Detalhes do banco de dados, clique em Excluir.
Confirme se quer excluir o banco de dados e clique em Excluir.
Excluir a instância
A exclusão de uma instância descarta automaticamente todos os bancos de dados criados nela.
Na linha de comando
gcloud spanner instances delete test-instance
Use o console do Google Cloud
Acesse a página Instâncias do Spanner no console do Google Cloud.
Clique na sua instância.
Clique em Excluir.
Confirme se quer excluir a instância e clique em Excluir.
A seguir
Saiba como acessar o Spanner com uma instância de máquina virtual.
Saiba mais sobre credenciais de autorização e autenticação em Autenticar para do Google Cloud usando bibliotecas de cliente.
Saiba mais sobre as práticas recomendadas de criação de esquemas do Spanner.