Objetivos
Este tutorial explica os seguintes passos através do controlador Spanner database/sql:
- 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 de base de dados local/SQL
Transfira e instale o Go no seu computador de desenvolvimento, se ainda não estiver instalado.
Clone o repositório de exemplo para a sua máquina local:
git clone https://github.com/googleapis/go-sql-spanner.git
Altere para o diretório que contém o código de exemplo do Spanner:
cd go-sql-spanner/snippets
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 database/sql.
Consulte o ficheirogetting_started_guide.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
gcloud spanner databases create example-db --instance=test-instance
PostgreSQL
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.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go createtables projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go createtablespg projects/GCLOUD_PROJECT/instances/test-instance/databases/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 umsql.DB
. sql.DB
contém um conjunto de ligações
que pode ser usado para interagir com o Spanner. O nome da base de dados e outras propriedades de associação são especificados no nome da origem de dados database/sql.
GoogleSQL
PostgreSQL
Escreva dados com DML
Pode inserir dados através da linguagem de manipulação de dados (DML) numa transação de leitura/escrita.
Use a função ExecContext
para executar uma declaração DML.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go dmlwrite projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go dmlwritepg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
4 records 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.
conn.Raw
para obter uma referência à ligação do Spanner subjacente. A função SpannerConn.Apply
aplica mutações de forma atómica à base de dados.
O código seguinte mostra como escrever os dados através de mutações:
GoogleSQL
PostgreSQL
Execute o seguinte exemplo com o argumento write
:
GoogleSQL
go run getting_started_guide.go write projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go writepg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
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 do controlador de base de dados/SQL do Spanner.
Na linha de comandos
Execute a seguinte declaração SQL 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'
PostgreSQL
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 a base de dados do Spanner/controlador SQL
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 do controlador database/sql do Spanner.
As seguintes funções e structs são usadas para executar uma consulta SQL:- A função
QueryContext
na structDB
: use esta função para executar uma declaração SQL que devolve linhas, como uma consulta ou uma declaração DML com uma cláusulaTHEN RETURN
. - A estrutura
Rows
: use-a para aceder aos dados devolvidos por uma declaração SQL.
O exemplo seguinte usa a função QueryContext
:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go query projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querypg 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
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
.
O controlador SQL/base de dados do Spanner suporta parâmetros de consulta posicionais e com nome. Um ?
numa declaração SQL indica um parâmetro de consulta posicional. Transmita os valores dos parâmetros de consulta como argumentos adicionais para a função QueryContext
. Por exemplo:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go querywithparameter projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querywithparameterpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
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 Google Cloud CLI ou programaticamente através do controlador SQL/base de dados do Spanner.
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 marketing_budget bigint'
Deve ver:
Schema updating...done.
Use a base de dados do Spanner/controlador SQL
Use a funçãoExecContext
para
modificar o esquema:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go addcolumn projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go addcolumnpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
Added MarketingBudget column.
Execute um lote de LDD
Recomendamos que execute várias modificações do esquema num lote. Use os comandos START BATCH DDL
e RUN BATCH
para executar um lote de LDD. O exemplo seguinte cria duas tabelas num lote:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go ddlbatch projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go ddlbatchpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
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)
.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go update projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go updatepg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
O resultado mostra:
Updated 2 albums
Também pode executar uma consulta SQL para obter os valores que acabou de escrever.
O exemplo seguinte usa a função QueryContext
para executar uma consulta:
GoogleSQL
PostgreSQL
Para executar esta consulta, execute o seguinte comando:
GoogleSQL
go run getting_started_guide.go querymarketingbudget projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querymarketingbudgetpg 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.
Chame DB.BeginTx
para executar transações de leitura/escrita em database/sql.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go writewithtransactionusingdml projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go writewithtransactionusingdmlpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
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 transmitir opções de transação adicionais à função spannerdriver.BeginReadWriteTransaction
.
Use spannerdriver.ExecOptions
para transmitir opções de consulta adicionais para uma declaração SQL. Por exemplo:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go tags projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go tagspg projects/GCLOUD_PROJECT/instances/test-instance/databases/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 o campo TxOptions.ReadOnly
como
true
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:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go readonlytransaction projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go readonlytransactionpg 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 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 query 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.
O exemplo seguinte mostra como executar uma consulta particionada com o Data Boost com o controlador database/sql:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go databoost projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go databoostpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
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.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
go run getting_started_guide.go pdml projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go pdmlpg projects/GCLOUD_PROJECT/instances/test-instance/databases/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.