Objetivos
Este tutorial apresenta as seguintes etapas usando a biblioteca de cliente do Spanner para C#:
- 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 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 C# local
Defina a variável de ambiente
GOOGLE_PROJECT_ID
para seu ID do projeto do Google Cloud.Primeiro, defina
GOOGLE_PROJECT_ID
para a sessão atual do PowerShell:$env:GOOGLE_PROJECT_ID = "MY_PROJECT_ID"
Em seguida, defina
GOOGLE_PROJECT_ID
para todos os processos criados após este comando:[Environment]::SetEnvironmentVariable("GOOGLE_PROJECT_ID", "MY_PROJECT_ID", "User")
Faça o download das credenciais.
Acesse a página Credenciais no console do Google Cloud.
Clique em Criar credenciais e escolha Chave da conta de serviço.
Em "Conta de serviço", escolha conta de serviço padrão do Compute Engine e deixe JSON selecionado em "Tipo de chave". Clique em Criar. Será feito o download de um arquivo JSON.
Configure as credenciais. Para um arquivo denominado
FILENAME.json
no diretório "Downloads" deCURRENT_USER
, localizado na unidadeC
, execute os seguintes comandos para definirGOOGLE_APPLICATION_CREDENTIALS
para apontar para a chave JSON:Primeiro, para definir
GOOGLE_APPLICATION_CREDENTIALS
para esta sessão do PowerShell, execute:$env:GOOGLE_APPLICATION_CREDENTIALS = "C:\Users\CURRENT_USER\Downloads\FILENAME.json"
Em seguida, para definir
GOOGLE_APPLICATION_CREDENTIALS
para todos os processos criados após este comando, execute:[Environment]::SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", "C:\Users\CURRENT_USER\Downloads\FILENAME.json", "User")
Clone o repositório do aplicativo de amostra na máquina local:
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Abra
Spanner.sln
, localizado no diretóriodotnet-docs-samples\spanner\api
do repositório salvo, com o Visual Studio 2017 ou posterior e compile-o.No mesmo repositório, mude para o diretório que contém o aplicativo compilado. Por exemplo:
cd dotnet-docs-samples\spanner\api\Spanner
Criar uma instância
Quando você usa o Spanner pela primeira vez, precisa criar uma instância, que é um 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 1 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 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 uma amostra que mostra como usar o Spanner com C#.
Confira o repositório do GitHub do Spanner .NET, que mostra como criar um banco de dados e modificar um esquema de banco de dados. Os dados usam o esquema de exemplo mostrado na página Esquema e modelo de dados.
Criar um banco de dados
Crie um banco de dados chamado example-db
na instância denominada test-instance
executando o seguinte na linha de comando.
dotnet run createSampleDatabase $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá:
Created sample database example-db on instance test-instance
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, você precisa criar um SpannerConnection
:
Pense em um SpannerConnection
como uma conexão de banco de dados: todas as suas interações.
com o Spanner precisam passar por um SpannerConnection
.
Leia mais na referência de SpannerConnection
.
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 ExecuteNonQueryAsync()
para executar uma instrução DML.
Execute a amostra usando o argumento writeUsingDml
.
dotnet run writeUsingDml $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá:
4 row(s) inserted...
Gravar dados com mutações
Também é possível inserir dados usando mutações.
É possível inserir dados usando o método connection.CreateInsertCommand()
(em inglês), que cria um novo SpannerCommand
para inserir linhas em uma tabela. O método SpannerCommand.ExecuteNonQueryAsync()
(em inglês) adiciona novas linhas à tabela.
Este código mostra como inserir dados usando mutações:
Execute a amostra usando o argumento insertSampleData
.
dotnet run insertSampleData $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá:
Inserted data.
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 a biblioteca de cliente do Spanner para C#.
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 a biblioteca de cliente do Spanner para C#
Além de executar uma instrução SQL na linha de comando, você pode emitir o mesma instrução SQL usando a biblioteca de cliente do Spanner para C#.
Use ExecuteReaderAsync()
(em inglês) para executar a consulta SQL.
Veja como emitir a consulta e acessar os dados:
dotnet run querySampleData $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá o seguinte resultado:
SingerId: 1 AlbumId: 1 AlbumTitle: Total Junk
SingerId: 1 AlbumId: 2 AlbumTitle: Go, Go, Go
SingerId: 2 AlbumId: 1 AlbumTitle: Green
SingerId: 2 AlbumId: 2 AlbumTitle: Forever Hold your Peace
SingerId: 2 AlbumId: 3 AlbumTitle: 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 Use parâmetros de consulta para acelerar as consultas executadas com frequência.
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
.
Veja como emitir a consulta com um parâmetro e acessar os dados:
dotnet run queryWithParameter $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá o seguinte resultado:
SingerId : 12 FirstName : Melissa LastName : 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. As atualizações de esquema não exigem
banco de dados off-line e não bloqueiam tabelas ou colunas inteiras. você pode continuar
gravação de dados no banco de dados durante a atualização do esquema. Leia mais sobre os recursos
e o desempenho das alterações de esquema
Faça 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 a biblioteca de cliente do Spanner para C#.
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 C#
UseCreateDdlCommand()
para modificar o esquema:
Execute a amostra usando o comando addColumn
.
dotnet run addColumn $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá:
Added the MarketingBudget column.
Gravar dados na nova coluna
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 a amostra usando o comando writeDataToNewColumn
.
dotnet run writeDataToNewColumn $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá:
Updated data.
Você também pode executar uma consulta SQL para buscar os valores que acabou de gravar.
Veja a seguir o código para executar a consulta:
Para executar essa consulta, execute a amostra usando o argumento queryNewColumn
.
dotnet run queryNewColumn $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá:
SingerId : 1 AlbumId : 1 MarketingBudget : 100000
SingerId : 1 AlbumId : 2 MarketingBudget :
SingerId : 2 AlbumId : 1 MarketingBudget :
SingerId : 2 AlbumId : 2 MarketingBudget : 500000
SingerId : 2 AlbumId : 3 MarketingBudget :
Atualizar dados
É possível atualizar dados usando DML em uma transação de leitura/gravação.
Use o método ExecuteNonQueryAsync()
para executar uma instrução DML.
Execute a amostra usando o argumento writeWithTransactionUsingDml
.
dotnet run writeWithTransactionUsingDml $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá:
Transaction complete.
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 é compatível com a adição de um índice enquanto o banco de dados continua a veicular o tráfego. O Spanner preenche automaticamente o com os dados que você já tem. 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 Adicione um índice secundário.
Depois que você adiciona 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 programaticamente usando a biblioteca de cliente do Spanner para C#.
Na linha de comando
Use o comando CREATE INDEX
a seguir 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 C#
Use CreateDdlCommand()
para adicionar um índice:
Execute a amostra usando o comando addIndex
.
dotnet run addIndex $env:GOOGLE_PROJECT_ID test-instance example-db
A adição do índice pode levar alguns minutos. Depois da adição, você verá:
Added the AlbumsByAlbumTitle index.
Adicionar um índice para leituras somente de índice
Talvez você tenha notado que o exemplo de leitura anterior não inclui a leitura da coluna MarketingBudget
. Isso ocorre porque a interface de leitura do Spanner
não é compatível com a capacidade de fazer a junção de um índice a uma tabela de dados para pesquisar 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 C#
UseCreateDdlCommand()
para adicionar um índice com uma cláusula STORING
:
Execute a amostra usando o comando addStoringIndex
.
dotnet run addStoringIndex $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá:
Added the AlbumsByAlbumTitle2 index.
Agora é possível executar uma leitura que busque todas as colunas AlbumId
, AlbumTitle
e MarketingBudget
do índice AlbumsByAlbumTitle2
:
Leia os dados usando o índice de armazenamento criado, executando uma consulta que especifique de forma explícita o índice:
Execute a amostra usando o comando queryDataWithStoringIndex
.
dotnet run queryDataWithStoringIndex $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá uma saída como:
AlbumId : 2 AlbumTitle : Forever Hold your Peace MarketingBudget : 300000
AlbumId : 2 AlbumTitle : Go, Go, Go MarketingBudget : 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 de transação, portanto, o aplicativo sempre recebe dados consistentes.
Use o TransactionScope()
do .NET Framework com OpenAsReadOnlyAsync()
para executar transações somente leitura.
A seguir, veja como executar uma consulta e fazer uma leitura na mesma transação somente leitura:
.NET Standard 2.0
.NET Standard 1.5
Execute a amostra usando o comando queryDataWithTransaction
.
dotnet run queryDataWithTransaction $env:GOOGLE_PROJECT_ID test-instance example-db
Você verá uma saída como:
SingerId : 2 AlbumId : 2 AlbumTitle : Forever Hold your Peace
SingerId : 1 AlbumId : 2 AlbumTitle : Go, Go, Go
SingerId : 2 AlbumId : 1 AlbumTitle : Green
SingerId : 2 AlbumId : 3 AlbumTitle : Terrified
SingerId : 1 AlbumId : 1 AlbumTitle : Total Junk
SingerId : 2 AlbumId : 2 AlbumTitle : Forever Hold your Peace
SingerId : 1 AlbumId : 2 AlbumTitle : Go, Go, Go
SingerId : 2 AlbumId : 1 AlbumTitle : Green
SingerId : 2 AlbumId : 3 AlbumTitle : Terrified
SingerId : 1 AlbumId : 1 AlbumTitle : Total Junk
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
- Teste a versão de pré-lançamento do provedor de banco de dados do Spanner para o Entity Framework Core.
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 do Google Cloud usando bibliotecas de cliente.
Saiba mais sobre as práticas recomendadas de design de esquema do Spanner.