Objetivos
Neste tutorial, você vai seguir estas etapas usando a biblioteca de cliente do Spanner para Go:
- Criar 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 do 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 Configuração, que abrangem a criação e a definição de um projeto padrão do Google Cloud , a ativação do faturamento, a ativação da 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 seu ambiente Go local
Se ainda não tiver feito isso, instale o Go (fazer download) no seu computador.
Caso ainda não tenha configurado a variável de ambiente
GOPATHconforme descrito em Testar sua instalação (em inglês), faça isso agora.Faça o download das amostras para sua máquina.
git clone https://github.com/GoogleCloudPlatform/golang-samples $GOPATH/src/github.com/GoogleCloudPlatform/golang-samplesMude para o diretório que contém o exemplo de código do Spanner:
cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/spanner/spanner_snippetsDefina a variável de ambiente
PROJECT_IDcomo o ID do projeto do Google Cloud :export PROJECT_ID=[MY_PROJECT_ID]
Criar uma instância
Quando você usa o Spanner pela primeira vez, é preciso 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.
Consulte Criar uma instância
para saber como criar uma instância do Spanner usando um dos
métodos a seguir. Você pode nomear sua instância como test-instance para usá-la com
outros tópicos neste documento que fazem referência a uma instância chamada test-instance.
- A Google Cloud CLI
- O console do Google Cloud
- Uma biblioteca de cliente (C++, C#, Go, Java, Node.js, PHP, Python, Ruby ou Rust)
Consultar os arquivos de amostra
O repositório de amostras contém um exemplo que mostra como usar o Spanner com o Go.
Confira o arquivosnippet.go, que mostra como usar o
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.
Criar um banco de dados
GoogleSQL
go run snippet.go createdatabase projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgcreatedatabase projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá:
Created database [example-db]
GoogleSQL
PostgreSQL
O próximo passo é gravar dados no seu banco de dados.
Criar um cliente de banco de dados
Antes de fazer leituras ou gravações, crie umClient:
Pense em um Client como uma conexão de banco de dados: todas as suas interações com o Spanner precisam passar por um Client. Normalmente, você cria um Client quando seu aplicativo é iniciado, depois reutiliza esse Client para ler, gravar e executar transações. Cada cliente usa recursos no
Spanner.
Se você criar vários clientes no mesmo aplicativo, chame
Client.Close() para limpar
os recursos do cliente, incluindo as conexões de rede, assim que ele não for
mais necessário.
Leia mais na referência de Client.
O código no exemplo anterior também mostra como criar um
DatabaseAdminClient,
que é usado para criar um banco de dados.
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.
Use o método Update() para executar uma instrução DML.
GoogleSQL
PostgreSQL
Execute o exemplo usando o argumento dmlwrite para o Google SQL e o argumento pgdmlwrite para o PostgreSQL:
GoogleSQL
go run snippet.go dmlwrite projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgdmlwrite projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá:
4 record(s) inserted.
Gravar dados com mutações
Também é possível inserir dados usando mutações.
Um Mutation é um contêiner para operações de mutação. Uma Mutation representa uma sequência de inserções, atualizações e exclusões que o Spanner aplica atomicamente a diferentes linhas e tabelas em um banco de dados do Spanner.
Use Mutation.InsertOrUpdate() (em inglês) para construir uma mutação INSERT_OR_UPDATE, que adiciona uma nova linha ou atualiza valores de coluna caso a linha já exista. Como alternativa, use o método Mutation.Insert() (em inglês) para construir uma mutação INSERT, que adiciona uma nova linha.
Client.Apply() (em inglês) aplica mutações atomicamente a um banco de dados.
Este código mostra como gravar dados usando mutações:
Execute a amostra usando o argumento write:
go run snippet.go write projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá o comando executado com sucesso.
Consultar dados usando SQL
O Spanner é compatível com uma interface SQL para ler dados, que pode ser acessada na linha de comando usando a Google Cloud CLI ou de maneira programática usando a biblioteca de cliente do Spanner para Go.
Na linha de comando
Execute a instrução SQL a seguir para ler os valores de todas as colunas da tabela Albums:
GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT SingerId, AlbumId, AlbumTitle FROM Albums'
Sintaxe de pipe do GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='FROM Albums |> SELECT SingerId, AlbumId, AlbumTitle'
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
Usar a biblioteca de cliente do Spanner para Go
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 a biblioteca de cliente do Spanner para Go.
Os métodos e tipos a seguir são usados para executar a consulta SQL:Client.Single(): use isso para ler o valor de uma ou mais colunas de uma ou mais linhas em uma tabela do Spanner.Client.Singleretorna umReadOnlyTransaction, que é usado para executar uma instrução SQL.ReadOnlyTransaction.Query(): use este método para executar uma consulta em um banco de dados.- O tipo
Statement: use para criar uma string SQL. - O tipo
Row: use para acessar os dados retornados por uma instrução SQL ou chamada de leitura.
Veja como emitir a consulta e acessar os dados:
Execute a amostra usando o argumento query.
go run snippet.go query projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá o resultado a seguir:
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 o aplicativo tiver uma consulta executada com frequência, é possível melhorar o desempenho dela parametrizando-a. 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 Usar parâmetros de consulta para acelerar consultas executadas com frequência.
Veja um exemplo de como usar um parâmetro na cláusula WHERE para consultar registros
que contêm um valor específico para LastName.
GoogleSQL
PostgreSQL
Execute o exemplo usando o argumento querywithparameter para o Google SQL e o argumento pgqueryparameter para o PostgreSQL.
GoogleSQL
go run snippet.go querywithparameter projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgqueryparameter projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá uma saída como:
12 Melissa Garcia
Ler dados usando a API de leitura
Além da interface SQL, o Spanner também é compatível com uma interface de leitura.
UseReadOnlyTransaction.Read() para ler as linhas do banco de dados. Use KeySet para definir um conjunto de chaves e intervalos de chaves a serem lidos.
Veja como ler os dados:
Execute a amostra usando o argumento read.
go run snippet.go read projects/PROJECT_ID/instances/test-instance/databases/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
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. Com o Spanner, você pode atualizar esquemas enquanto o banco de dados continua a disponibilizar o tráfego. Para atualizar esquemas, não é necessário desconectar o banco de dados nem bloquear tabelas ou colunas inteiras. É possível gravar dados no banco de dados durante a atualização. Leia mais sobre as atualizações de esquema compatíveis e o desempenho das alterações de esquema em Fazer atualizações de esquema.
Adicionar uma coluna
É possível adicionar uma coluna na linha de comando usando a Google Cloud CLI ou de maneira programática usando a biblioteca de cliente do Spanner para Go.
Na linha de comando
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'
Você verá:
Schema updating...done.
Usar a biblioteca de cliente do Spanner para Go
UseDatabaseAdminClient.UpdateDatabaseDdl() para modificar o esquema:
GoogleSQL
PostgreSQL
Execute o exemplo usando o argumento addnewcolumn para o Google SQL e o argumento pgaddnewcolumn para o PostgreSQL.
GoogleSQL
go run snippet.go addnewcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgaddnewcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá:
Added MarketingBudget column.
Gravar dados na nova coluna
O código a seguir grava dados na coluna nova. Ele define MarketingBudget como
100000 para a chave de linha Albums(1, 1) e como 500000 para a chave de linha
Albums(2, 2).
Execute a amostra usando o argumento update.
go run snippet.go update projects/PROJECT_ID/instances/test-instance/databases/example-db
Também é possível executar uma consulta SQL ou uma chamada de leitura para coletar os valores que você acabou de gravar.
Veja a seguir o código para executar a consulta:
GoogleSQL
PostgreSQL
Para executar essa consulta, execute o exemplo usando o argumento querynewcolumn para o Google SQL e o argumento pgquerynewcolumn para o PostgreSQL.
GoogleSQL
go run snippet.go querynewcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgquerynewcolumn projects/PROJECT_ID/instances/test-instance/databases/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.
Use o método Update() para executar uma instrução DML.
GoogleSQL
PostgreSQL
Execute a amostra usando o argumento dmlwritetxn.
go run snippet.go dmlwritetxn projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá:
Moved 200000 from Album2's MarketingBudget to Album1's.
Usar um índice secundário
Suponha que você queira buscar todas as linhas de Albums que tenham valores AlbumTitle em um determinado intervalo. É possível ler todos os valores da coluna AlbumTitle usando uma instrução SQL ou uma chamada de leitura e descartar as linhas que não satisfazem os critérios, mas fazer essa verificação na tabela inteira é caro, especialmente para tabelas com muitas linhas. Em vez disso, acelere a recuperação de linhas ao pesquisar por colunas de chaves não primárias por meio da criação de um índice secundário na tabela.
Adicionar um índice secundário a uma tabela requer uma atualização de esquema. Como outras atualizações de esquema, o Spanner permite adicionar um índice enquanto o banco de dados continua a disponibilizar o tráfego. O Spanner preenche automaticamente o índice com os dados atuais. Os preenchimentos podem levar alguns minutos para serem concluídos, mas você não precisa ficar off-line ou evitar gravar na tabela indexada durante esse processo. Para mais detalhes, consulte Adicionar um índice secundário.
Depois de adicionar um índice secundário, o Spanner o usa automaticamente para consultas SQL que provavelmente serão executadas mais rapidamente com o índice. Se você usar a interface de leitura, deverá especificar o índice que quer usar.
Adicionar um índice secundário
É possível adicionar um índice na linha de comando usando a CLI gcloud ou de maneira programática usando a biblioteca de cliente do Spanner para Go.
Na linha de comando
Use o seguinte comando CREATE INDEX
para adicionar um índice ao banco de dados:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)'
Você verá:
Schema updating...done.
Como usar a biblioteca de cliente do Spanner para Go
UseUpdateDatabaseDdl() para adicionar um índice:
A adição do índice pode levar alguns minutos. Depois da adição, você verá:
Added index
Ler usando o índice
Para consultas SQL, o Spanner usa automaticamente um índice apropriado. Na interface de leitura, especifique o índice em sua solicitação.
Para usar o índice na interface de leitura, use ReadOnlyTransaction.ReadUsingIndex(), que lê zero ou mais linhas de um banco de dados usando um índice.
O código a seguir busca todas as colunas AlbumId e AlbumTitle do índice AlbumsByAlbumTitle.
Execute a amostra usando o argumento readindex.
go run snippet.go readindex projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá:
2 Forever Hold Your Peace
2 Go, Go, Go
1 Green
3 Terrified
1 Total Junk
Adicionar um índice para leituras somente de índice
Observe que o exemplo de leitura anterior não inclui a leitura
da coluna MarketingBudget. Isso acontece porque a interface de leitura do Spanner não oferece suporte à capacidade de mesclar um índice com uma tabela de dados para pesquisa rápida de 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 comando
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 do índice pode levar alguns minutos. Depois da adição, você verá:
Schema updating...done.
Como usar a biblioteca de 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 a amostra usando o argumento addstoringindex.
GoogleSQL
go run snippet.go addstoringindex projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgaddstoringindex projects/PROJECT_ID/instances/test-instance/databases/example-db
A adição do índice pode levar alguns minutos. Depois da adição, você verá:
Added storing index
Agora é possível executar uma leitura que busque todas as colunas AlbumId, AlbumTitle e MarketingBudget do índice AlbumsByAlbumTitle2:
Execute a amostra usando o argumento readstoringindex.
go run snippet.go readstoringindex projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá uma saída como:
2 Forever Hold Your Peace 300000
2 Go, Go, Go NULL
1 Green NULL
3 Terrified NULL
1 Total Junk 300000
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 estão de acordo com um prefixo consistente do histórico de confirmações da transação. Portanto, o aplicativo sempre recebe dados consistentes.
Use o tipo ReadOnlyTransaction para executar transações somente leitura. Use Client.ReadOnlyTransaction() para receber um ReadOnlyTransaction.
Veja a seguir como executar uma consulta e fazer uma leitura na mesma transação somente leitura.
Execute a amostra usando o argumento readonlytransaction.
go run snippet.go readonlytransaction projects/PROJECT_ID/instances/test-instance/databases/example-db
Você verá uma saída como:
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 cobranças extras na sua conta do Cloud Billing pelos recursos usados neste tutorial, remova 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
Como usar 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
Como usar 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 as credenciais de autorização e autenticação em Autenticar os serviços do Cloud usando bibliotecas de cliente.
Saiba mais sobre as práticas recomendadas de design de esquema do Spanner.