Objetivos
Este tutorial explica os seguintes passos através da biblioteca do cliente do Spanner para Go:
- 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 Go local
Instale o Go (transferir) no seu computador de desenvolvimento, se ainda não estiver instalado.
Configure a variável de ambiente
GOPATH
, se ainda não estiver configurada, conforme descrito em Teste a sua instalação.Transfira os exemplos para o seu computador.
git clone https://github.com/GoogleCloudPlatform/golang-samples $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples
Altere para o diretório que contém o código de exemplo do Spanner:
cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/spanner/spanner_snippets
Defina a variável de ambiente
GCLOUD_PROJECT
para o ID do projeto Google Cloud :export GCLOUD_PROJECT=[MY_PROJECT_ID]
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 Go.
Consulte o ficheirosnippet.go
, 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.
Crie uma base de dados
GoogleSQL
go run snippet.go createdatabase projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgcreatedatabase projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deve ver:
Created database [example-db]
GoogleSQL
PostgreSQL
O passo seguinte é escrever dados na sua base de dados.
Crie um cliente de base de dados
Antes de poder fazer leituras ou escritas, tem de criar umClient
:
Pode pensar num Client
como uma ligação de base de dados: todas as suas interações com o Spanner têm de passar por um Client
. Normalmente, cria um Client
quando a sua aplicação é iniciada e, em seguida, volta a usar esse Client
para ler, escrever e executar transações. Cada cliente usa recursos no Spanner.
Se criar vários clientes na mesma app, deve chamar Client.Close()
para limpar os recursos do cliente, incluindo as ligações de rede, assim que deixar de ser necessário.
Leia mais na Client
referência.
O código no exemplo anterior também mostra como criar um
DatabaseAdminClient
,
que é usado para criar uma base de dados.
Escreva dados com DML
Pode inserir dados através da linguagem de manipulação de dados (DML) numa transação de leitura/escrita.
Usa o método Update()
para executar uma declaração DML.
GoogleSQL
PostgreSQL
Execute o exemplo com o argumento dmlwrite
para o Google SQL e o argumento pgdmlwrite
para o PostgreSQL:
GoogleSQL
go run snippet.go dmlwrite projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgdmlwrite projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deve ver:
4 record(s) inserted.
Escreva dados com mutações
Também pode inserir dados através de alterações.
Um Mutation
é um contentor para operações de mutação. Um Mutation
representa uma sequência de inserções, atualizações e eliminações que o Spanner aplica atomicamente a diferentes linhas e tabelas numa base de dados do Spanner.
Use Mutation.InsertOrUpdate()
para criar uma mutação INSERT_OR_UPDATE
, que adiciona uma nova linha ou atualiza os valores das colunas se a linha já existir. Em alternativa, use o método
Mutation.Insert()
para criar uma mutação INSERT
, que adiciona uma nova linha.
Client.Apply()
aplica mutações de forma atómica a uma base de dados.
Este código mostra como escrever os dados através de mutações:
Execute o exemplo com o argumento write
:
go run snippet.go write projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deverá ver o comando executado com êxito.
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 da biblioteca de cliente do Spanner para Go.
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 SingerId, AlbumId, AlbumTitle 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 a biblioteca cliente do Spanner para Go
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 da biblioteca do cliente do Spanner para Go.
Os seguintes métodos e tipos são usados para executar a consulta SQL:Client.Single()
: use esta função para ler o valor de uma ou mais colunas de uma ou mais linhas numa tabela do Spanner.Client.Single
devolve umReadOnlyTransaction
, que é usado para executar uma declaração de leitura ou SQL.ReadOnlyTransaction.Query()
: use este método para executar uma consulta numa base de dados.- O tipo
Statement
: use-o para criar uma string SQL. - O tipo
Row
: use-o para aceder aos dados devolvidos por uma declaração SQL ou uma chamada de leitura.
Veja como emitir a consulta e aceder aos dados:
Execute o exemplo com o argumento query
.
go run snippet.go query projects/GCLOUD_PROJECT/instances/test-instance/databases/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
.
GoogleSQL
PostgreSQL
Execute o exemplo com o argumento querywithparameter
para o Google SQL e o argumento pgqueryparameter
para o PostgreSQL.
GoogleSQL
go run snippet.go querywithparameter projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgqueryparameter projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deverá ver uma saída semelhante à seguinte:
12 Melissa Garcia
Leia dados através da API de leitura
Além da interface SQL do Spanner, o Spanner também suporta uma interface de leitura.
UseReadOnlyTransaction.Read()
para ler linhas da base de dados. Use KeySet
para definir uma coleção de chaves e intervalos de chaves a ler.
Veja como ler os dados:
Execute o exemplo com o argumento read
.
go run snippet.go read projects/GCLOUD_PROJECT/instances/test-instance/databases/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
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 da biblioteca do cliente do Spanner para Go.
Na linha de comandos
Use o seguinte comando ALTER TABLE
para
adicionar a nova coluna à tabela:
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget INT64'
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget BIGINT'
Deve ver:
Schema updating...done.
Use a biblioteca cliente do Spanner para Go
UseDatabaseAdminClient.UpdateDatabaseDdl()
para modificar o esquema:
GoogleSQL
PostgreSQL
Execute o exemplo com o argumento addnewcolumn
para o Google SQL e o argumento pgaddnewcolumn
para o PostgreSQL.
GoogleSQL
go run snippet.go addnewcolumn projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgaddnewcolumn projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deve ver:
Added MarketingBudget column.
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)
.
Execute o exemplo com o argumento update
.
go run snippet.go update projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Também pode executar uma consulta SQL ou uma chamada de leitura para obter os valores que acabou de escrever.
Aqui está o código para executar a consulta:
GoogleSQL
PostgreSQL
Para executar esta consulta, execute o exemplo com o argumento querynewcolumn
para o Google SQL e o argumento pgquerynewcolumn
para o PostgreSQL.
GoogleSQL
go run snippet.go querynewcolumn projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgquerynewcolumn projects/GCLOUD_PROJECT/instances/test-instance/databases/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.
Usa o método Update()
para executar uma declaração DML.
GoogleSQL
PostgreSQL
Execute o exemplo com o argumento dmlwritetxn
.
go run snippet.go dmlwritetxn projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deve ver:
Moved 200000 from Album2's MarketingBudget to Album1's.
Use um índice secundário
Suponhamos que quer obter todas as linhas de Albums
que têm valores AlbumTitle
num determinado intervalo. Pode ler todos os valores da coluna AlbumTitle
através de uma declaração SQL ou de uma chamada de leitura e, em seguida, rejeitar as linhas que não cumprem os critérios, mas esta análise completa da tabela é dispendiosa, especialmente para tabelas com muitas linhas. Em alternativa, pode acelerar a obtenção de linhas quando
pesquisa por colunas de chaves não primárias criando um
índice secundário na tabela.
A adição de um índice secundário a uma tabela existente requer uma atualização do esquema. Tal como outras atualizações de esquemas, o Spanner suporta a adição de um índice enquanto a base de dados continua a publicar tráfego. O Spanner repreenche automaticamente o índice com os seus dados existentes. Os preenchimentos podem demorar alguns minutos a serem concluídos, mas não tem de colocar a base de dados offline nem evitar escrever na tabela indexada durante este processo. Para mais detalhes, consulte o artigo Adicione um índice secundário.
Depois de adicionar um índice secundário, o Spanner usa-o automaticamente para consultas SQL que provavelmente são executadas mais rapidamente com o índice. Se usar a interface read, tem de especificar o índice que quer usar.
Adicione um índice secundário
Pode adicionar um índice na linha de comandos através da CLI gcloud ou programaticamente através da biblioteca de cliente do Spanner para Go.
Na linha de comandos
Use o seguinte comando CREATE INDEX
para adicionar um índice à base de dados:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)'
Deve ver:
Schema updating...done.
Usar a biblioteca cliente do Spanner para Go
UseUpdateDatabaseDdl()
para adicionar um índice:
A adição de um índice pode demorar alguns minutos. Depois de adicionar o índice, deve ver o seguinte:
Added index
Leia através do índice
Para consultas SQL, o Spanner usa automaticamente um índice adequado. Na interface de leitura, tem de especificar o índice no seu pedido.
Para usar o índice na interface de leitura, use ReadOnlyTransaction.ReadUsingIndex()
, que lê zero ou mais linhas de uma base de dados através de um índice.
O código seguinte obtém todas as colunas AlbumId
e AlbumTitle
do índice AlbumsByAlbumTitle
.
Execute o exemplo com o argumento readindex
.
go run snippet.go readindex projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deve ver:
2 Forever Hold Your Peace
2 Go, Go, Go
1 Green
3 Terrified
1 Total Junk
Adicione um índice para leituras apenas de índice
Pode ter reparado que o exemplo de leitura anterior não inclui a leitura da coluna MarketingBudget
. Isto deve-se ao facto de a interface de leitura do Spanner não suportar a capacidade de associar um índice a uma tabela de dados para procurar valores que não estão armazenados no índice.
Crie uma definição alternativa de AlbumsByAlbumTitle
que armazene uma cópia de
MarketingBudget
no índice.
Na linha de comandos
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget)
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) INCLUDE (MarketingBudget)
A adição de um índice pode demorar alguns minutos. Depois de adicionar o índice, deve ver o seguinte:
Schema updating...done.
Usar a biblioteca cliente do Spanner para Go
UseUpdateDatabaseDdl()
para adicionar um índice com uma cláusula STORING
para o GoogleSQL e uma cláusula INCLUDE
para o PostgreSQL:
GoogleSQL
PostgreSQL
Execute o exemplo com o argumento addstoringindex
.
GoogleSQL
go run snippet.go addstoringindex projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgaddstoringindex projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
A adição de um índice pode demorar alguns minutos. Depois de adicionar o índice, deve ver o seguinte:
Added storing index
Agora, pode executar uma leitura que obtenha todas as colunas AlbumId
, AlbumTitle
e MarketingBudget
do índice AlbumsByAlbumTitle2
:
Execute o exemplo com o argumento readstoringindex
.
go run snippet.go readstoringindex projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deverá ver uma saída semelhante à seguinte:
2 Forever Hold Your Peace 300000
2 Go, Go, Go NULL
1 Green NULL
3 Terrified NULL
1 Total Junk 300000
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.
Use o tipo ReadOnlyTransaction
para executar transações de leitura apenas. Use
Client.ReadOnlyTransaction()
para receber um ReadOnlyTransaction
.
O exemplo seguinte mostra como executar uma consulta e fazer uma leitura na mesma transação só de leitura:
Execute o exemplo com o argumento readonlytransaction
.
go run snippet.go readonlytransaction projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deverá ver uma saída semelhante à seguinte:
2 2 Forever Hold Your Peace
1 2 Go, Go, Go
2 1 Green
2 3 Terrified
1 1 Total Junk
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
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.