Objetivos
Este tutorial orienta você nas etapas a seguir usando o driver de banco de dados/SQL do Spanner:
- 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 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 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 de banco de dados/SQL local
Faça o download e instale o Go na sua máquina de desenvolvimento, se ainda não tiver feito isso.
Clone o repositório de amostra na sua máquina local:
git clone https://github.com/googleapis/go-sql-spanner.git
Mude para o diretório que contém o código de exemplo do Spanner:
cd go-sql-spanner/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 um 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 database/sql.
Confira o arquivogetting_started_guide.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
gcloud spanner databases create example-db --instance=test-instance
Você verá:
Creating database...done.
crie tabelas
O código a seguir cria duas tabelas no banco de dados.
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go createtables projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
O próximo passo é gravar dados no seu banco de dados.
Crie uma conexão
Antes de fazer leituras ou gravações, você deve criar umsql.DB
. sql.DB
contém um pool de conexões
que pode ser usado para interagir com o Spanner. O nome do banco de dados e outras propriedades de conexão são especificados no nome da fonte de dados do banco de dados/SQL.
Gravar dados com DML
Você pode 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 a função ExecContext
para executar uma instrução DML.
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go dmlwrite projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
4 records 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. Um 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.
conn.Raw
para receber uma referência à conexão
subjacente do Spanner. A função SpannerConn.Apply
aplica
mutações atomicamente ao banco de dados.
O código a seguir mostra como gravar dados usando mutações:
Execute o exemplo a seguir usando o argumento write
:
go run getting_started_guide.go write projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
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 o driver de banco de dados/SQL do Spanner.
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 SingerId, AlbumId, AlbumTitle 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 o driver de banco de dados/SQL do Spanner
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 o driver de banco de dados/SQL do Spanner.
As seguintes funções e estruturas são usadas para executar uma consulta SQL:- A função
QueryContext
no structDB
: use para executar uma instrução SQL que retorna linhas, como uma consulta ou uma instrução DML com uma cláusulaTHEN RETURN
. - A estrutura
Rows
: use-a para acessar os dados retornados por uma instrução SQL.
O exemplo a seguir usa a função QueryContext
:
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go query projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
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 a performance fazendo a parametrizaçã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 Usar parâmetros de consulta para agilizar as consultas mais executadas.
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
.
O driver de banco de dados/SQL do Spanner é compatível com parâmetros de consulta posicionais e nomeados. Um ?
em uma instrução SQL indica um parâmetro de consulta
posicional. Transmita os valores do parâmetro de consulta como argumentos adicionais para a
função QueryContext
. Exemplo:
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go querywithparameter projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
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. Para fazer atualizações no esquema, não é necessário desconectar o
banco de dados nem bloquear tabelas ou colunas inteiras. É possível continuar
gravando dados no banco de dados durante a atualização do esquema. 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 CLI do Google Cloud ou programaticamente usando o driver de banco de dados/SQL do Spanner.
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 MarketingBudget INT64'
Você verá:
Schema updating...done.
Usar o driver de banco de dados/SQL do Spanner
Use a funçãoExecContext
para
modificar o esquema:
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go addcolumn projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
Added MarketingBudget column.
Executar um lote de DDL
Recomendamos que você execute várias modificações de esquema em um lote. Use
os comandos START BATCH DDL
e RUN BATCH
para executar um lote de DDL. O exemplo a seguir cria duas tabelas em um lote:
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go ddlbatch projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
Added Venues and Concerts tables.
Gravar dados na coluna nova
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)
.
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go update projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
Updated 2 albums
Você também pode executar uma consulta SQL para buscar os valores que acabou de gravar.
O exemplo a seguir usa a função QueryContext
para executar uma consulta:
Para executar essa consulta, execute o seguinte comando:
go run getting_started_guide.go querymarketingbudget projects/$GCLOUD_PROJECT/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.
Chame DB.BeginTx
para executar transações de leitura e gravação
em database/sql.
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go writewithtransactionusingdml projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
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 transmitir
outras opções de transação para a função spannerdriver.BeginReadWriteTransaction
.
Use spannerdriver.ExecOptions
para transmitir outras opções de consulta para uma instrução SQL. Exemplo:
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go tags projects/$GCLOUD_PROJECT/instances/test-instance/databases/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 o campo TxOptions.ReadOnly
como
true
para executar uma transação somente leitura.
Veja a seguir como executar uma consulta e fazer uma leitura na mesma transação somente leitura.
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go readonlytransaction projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
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 latência maior do que a API de consulta padrão, porque é destinada apenas a operações em massa, como exportar ou verificar 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ó oferece suporte a consultas particionadas.
O exemplo a seguir mostra como executar uma consulta particionada com o Data Boost com o driver database/sql:
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go databoost projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db
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.
Execute o exemplo com o seguinte comando:
go run getting_started_guide.go pdml projects/$GCLOUD_PROJECT/instances/test-instance/databases/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 serviços do Cloud usando bibliotecas de cliente.
Saiba mais sobre as práticas recomendadas de design de esquema do Spanner.