Objetivos
Este tutorial explica os seguintes passos através do proxy local do PGAdapter do Spanner para controladores do PostgreSQL:
- Crie uma instância e uma base de dados do Spanner.
- Escrever, ler e executar consultas SQL em dados na base de dados.
- Atualize o esquema da base de dados.
- Atualize os dados através de uma transação de leitura/escrita.
- Adicione um índice secundário à base de dados.
- Use o índice para ler e executar consultas SQL em dados.
- Recuperar dados através de uma transação só de leitura.
Custos
Este tutorial usa o Spanner, que é um componente faturável do Google Cloud. Para obter informações sobre o custo de utilização do Spanner, consulte a secção Preços.
Antes de começar
Conclua os passos descritos em Configuração, que abrangem a criação e a definição de um projeto Google Cloud predefinido, a ativação da faturação, a ativação da API Cloud Spanner e a configuração do OAuth 2.0 para obter credenciais de autenticação para usar a API Cloud Spanner.
Em particular, certifique-se de que executa gcloud auth
application-default login
para configurar o seu ambiente de desenvolvimento local com
credenciais de autenticação.
Prepare o seu ambiente local do PGAdapter
Pode usar controladores PostgreSQL em combinação com o PGAdapter para se ligar ao Spanner. O PGAdapter é um proxy local que traduz o protocolo de rede PostgreSQL para o protocolo gRPC do Spanner.
O PGAdapter requer o Java ou o Docker para ser executado.
Instale uma das seguintes opções no seu computador de desenvolvimento se nenhuma delas já estiver instalada:
- JDK Java 8 (transferir).
- Docker (transferir).
Clone o repositório da app de exemplo para a sua máquina local:
git clone https://github.com/GoogleCloudPlatform/pgadapter.git
Altere para o diretório que contém o código de exemplo do Spanner:
psql
cd pgadapter/samples/snippets/psql-snippets
Java
cd pgadapter/samples/snippets/java-snippets mvn package -DskipTests
Ir
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
PHP
cd pgadapter/samples/snippets/php-snippets composer install cd samples
Crie uma instância
Quando usa o Spanner pela primeira vez, tem de criar uma instância, que é uma atribuição de recursos usados pelas bases de dados do Spanner. Quando cria uma instância, escolhe uma configuração da instância, que determina onde os seus dados são armazenados, bem como o número de nós a usar, o que determina a quantidade de recursos de publicação e armazenamento na sua instância.
Consulte o artigo Crie uma instância
para saber como criar uma instância do Spanner através de qualquer um dos
seguintes métodos. Pode dar o nome test-instance
à sua instância para a usar com outros tópicos neste documento que façam referência a uma instância com o nome test-instance
.
- A CLI do Google Cloud
- A Google Cloud consola
- Uma biblioteca cliente (C++, C#, Go, Java, Node.js, PHP, Python ou Ruby)
Explore ficheiros de exemplo
O repositório de exemplos contém um exemplo que mostra como usar o Spanner com o PGAdapter.
Consulte a pastasamples/snippets
, que mostra como usar o Spanner. O código mostra como criar e usar uma nova base de dados. Os dados usam o esquema de exemplo apresentado na página Esquema e modelo de dados.
Inicie o PGAdapter
Inicie o PGAdapter na sua máquina de desenvolvimento local e direcione-o para a instância que criou.
Os seguintes comandos pressupõem que executou o comando
gcloud auth application-default login
.
Aplicação 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
Isto inicia o PGAdapter com um emulador do Spanner incorporado. Este emulador incorporado cria automaticamente qualquer instância ou base de dados do Spanner à qual se ligar, sem ter de as criar manualmente antecipadamente.
Recomendamos que execute o PGAdapter em produção como um contentor side-car ou como uma dependência no processo. Para mais informações sobre a implementação do PGAdapter em produção, consulte o artigo Escolha um método para executar o PGAdapter.
Crie uma base de dados
gcloud spanner databases create example-db --instance=test-instance \
--database-dialect=POSTGRESQL
Deve ver:
Creating database...done.
Crie tabelas
O código seguinte cria duas tabelas na base de dados.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php create_tables.php example-db
O passo seguinte é escrever dados na sua base de dados.
Crie uma associação
Antes de poder fazer leituras ou escritas, tem de criar uma ligação ao PGAdapter. Todas as suas interações com o Spanner têm de passar por umConnection
. O nome da base de dados é especificado na string de ligação.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php create_connection.php example-db
Escreva dados com DML
Pode inserir dados através da linguagem de manipulação de dados (DML) numa transação de leitura/escrita.
Estes exemplos mostram como executar uma declaração DML no Spanner usando um controlador PostgreSQL.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php write_data_with_dml.php example-db
Deverá ver a seguinte resposta:
4 records inserted.
Escreva dados com um lote de DML
O PGAdapter suporta a execução de lotes de DML. O envio de várias declarações DML num lote reduz o número de viagens de ida e volta para o Spanner e melhora o desempenho da sua aplicação.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php write_data_with_dml_batch.php example-db
Deve ver:
3 records inserted.
Escreva dados com mutações
Também pode inserir dados através de alterações.
O PGAdapter traduz o comando COPY
do PostgreSQL em mutações. A utilização de COPY
é a forma mais eficiente de inserir rapidamente dados na sua base de dados do Spanner.
As operações COPY
são atómicas por predefinição. As operações atómicas no Spanner estão sujeitas ao limite de tamanho de confirmação.
Consulte o limite de CRUD para mais informações.
Estes exemplos mostram como executar uma operação COPY
não atómica. Isto permite que a operação COPY
exceda o limite de tamanho de confirmação.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php write_data_with_copy.php example-db
Deve ver:
Copied 5 singers
Copied 5 albums
Consultar dados através de SQL
O Spanner suporta uma interface SQL para ler dados, à qual pode aceder na linha de comandos através da Google Cloud CLI ou programaticamente através de um controlador PostgreSQL.
Na linha de comandos
Execute a seguinte declaração SQL 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 mostra:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Use um controlador do PostgreSQL
Além de executar uma declaração SQL na linha de comandos, pode emitir a mesma declaração SQL de forma programática através de um controlador PostgreSQL.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php query_data.php example-db
Deverá 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
Consultar através de um parâmetro SQL
Se a sua aplicação tiver uma consulta executada com frequência, pode melhorar o respetivo desempenho parametrizando-a. A consulta paramétrica resultante pode ser colocada em cache e reutilizada, o que reduz os custos de compilação. Para mais informações, consulte o artigo Use parâmetros de consulta para acelerar as consultas executadas com frequência.
Segue-se um exemplo da utilização de um parâmetro na cláusula WHERE
para consultar registos que contêm um valor específico para LastName
.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php query_data_with_parameter.php example-db
Deverá ver o seguinte resultado:
12 Melissa Garcia
Atualize o esquema da base de dados
Suponha que precisa de adicionar uma nova coluna denominada MarketingBudget
à tabela Albums
. A adição de uma nova coluna a uma tabela existente requer uma atualização ao esquema da base de dados. O Spanner suporta atualizações de esquemas a uma base de dados enquanto a base de dados continua a servir tráfego. As atualizações do esquema não requerem que a base de dados fique offline e não bloqueiam tabelas nem colunas inteiras. Pode continuar a escrever dados na base de dados durante a atualização do esquema. Leia mais acerca das atualizações de esquemas suportadas e do desempenho das alterações de esquemas em Faça atualizações de esquemas.
Adicione uma coluna
Pode adicionar uma coluna na linha de comandos através da CLI Google Cloud ou programaticamente através de um controlador PostgreSQL.
Na linha de comandos
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'
Deve ver:
Schema updating...done.
Use um controlador do PostgreSQL
Execute a declaração DDL com um controlador PostgreSQL para modificar o esquema:
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php add_column.php example-db
Deve ver:
Added marketing_budget column
Execute um lote de LDD
Recomendamos que execute várias modificações do esquema num lote.
Pode executar várias declarações DDL num lote através da funcionalidade de processamento em lote incorporada do seu controlador PostgreSQL, enviando todas as declarações DDL como uma string SQL separada por pontos e vírgulas ou usando as declarações START BATCH DDL
e RUN BATCH
.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php ddl_batch.php example-db
Deve ver:
Added venues and concerts tables
Escreva dados na nova coluna
O código seguinte escreve dados na nova coluna. Define MarketingBudget
como 100000
para a linha identificada por Albums(1, 1)
e como 500000
para a linha identificada por Albums(2, 2)
.
COPY
do PostgreSQL em mutações. Por predefinição, os comandos COPY
são traduzidos em mutações Insert
.
Execute set spanner.copy_upsert=true
para traduzir os comandos COPY
em mutações InsertOrUpdate
. Pode usar esta opção para atualizar os dados existentes no Spanner.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php update_data_with_copy.php example-db
Deve ver:
Updated 2 albums
Também pode executar uma consulta SQL para obter os valores que acabou de escrever.
Aqui está o código para executar a consulta:
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php query_data_with_new_column.php example-db
Deve ver:
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
Atualize os dados
Pode atualizar dados através de DML numa transação de leitura/escrita.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php update_data_with_transaction.php example-db
Deve ver:
Transferred marketing budget from Album 2 to Album 1
Etiquetas de transação e etiquetas de pedidos
Use etiquetas de transações e etiquetas de pedidos
para resolver problemas de transações e consultas no Spanner. Pode definir etiquetas de transação e etiquetas de pedidos com as variáveis de sessão SPANNER.TRANSACTION_TAG
e SPANNER.STATEMENT_TAG
.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php tags.php example-db
Obtenha dados através de transações só de leitura
Suponhamos que quer executar mais do que uma leitura na mesma data/hora. As transações de leitura exclusiva observam um prefixo
consistente do histórico de confirmações de transações, pelo que a sua aplicação recebe sempre
dados consistentes.
Defina a ligação como só de leitura ou use a declaração SET TRANSACTION READ ONLY
SQL
para executar uma transação só de leitura.
O exemplo seguinte mostra como executar uma consulta e fazer uma leitura na mesma transação só de leitura:
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php read_only_transaction.php example-db
Deverá ver uma saída semelhante à seguinte:
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 aumento de dados
A API partitionQuery
divide uma consulta em partes mais pequenas, ou partições, e usa várias máquinas para obter as partições em paralelo. Cada partição é identificada por um token de partição. A API PartitionQuery tem uma latência superior à da API de consulta padrão, porque destina-se apenas a operações em massa, como exportar ou analisar toda a base de dados.
O Data Boost permite-lhe executar consultas de estatísticas e exportações de dados com um impacto quase nulo nos fluxos de trabalho existentes na instância do Spanner aprovisionada. A otimização de dados só suporta consultas particionadas.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php data_boost.php example-db
Para mais informações sobre a execução de consultas particionadas e a utilização do Data Boost com o PGAdapter, consulte: Data Boost e declarações de consultas particionadas
DML particionada
A linguagem de manipulação de dados (DML) particionada foi concebida para os seguintes tipos de atualizações e eliminações em massa:
- Limpeza periódica e recolha de lixo.
- Preencher novas colunas com valores predefinidos.
psql
Java
Ir
Node.js
Python
C#
PHP
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
Ir
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
PHP
php partitioned_dml.php example-db
Limpeza
Para evitar incorrer em cobranças adicionais na sua conta do Cloud Billing pelos recursos usados neste tutorial, elimine a base de dados e a instância que criou.
Elimine a base de dados
Se eliminar uma instância, todas as bases de dados na mesma são eliminadas automaticamente. Este passo mostra como eliminar uma base de dados sem eliminar uma instância (continua a incorrer em custos pela instância).
Na linha de comandos
gcloud spanner databases delete example-db --instance=test-instance
Usar a Google Cloud consola
Aceda à página Instâncias do Spanner na Google Cloud consola.
Clique na instância.
Clique na base de dados que quer eliminar.
Na página Detalhes da base de dados, clique em Eliminar.
Confirme que quer eliminar a base de dados e clique em Eliminar.
Elimine a instância
A eliminação de uma instância elimina automaticamente todas as bases de dados criadas nessa instância.
Na linha de comandos
gcloud spanner instances delete test-instance
Usar a Google Cloud consola
Aceda à página Instâncias do Spanner na Google Cloud consola.
Clique na instância.
Clique em Eliminar.
Confirme que quer eliminar a instância e clique em Eliminar.
O que se segue?
Saiba como aceder ao Spanner com uma instância de máquina virtual.
Saiba mais sobre as credenciais de autorização e autenticação em Autenticação em serviços na nuvem através de bibliotecas cliente.
Saiba mais acerca das práticas recomendadas de criação de esquemas do Spanner.