Objetivos
Neste tutorial, mostramos as seguintes etapas usando o driver do ADO.NET do Spanner:
- 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 o ambiente local do ADO.NET
Faça o download e instale o .NET na sua máquina de desenvolvimento, se ainda não estiver instalado.
Clone o repositório de amostra na sua máquina local:
git clone https://github.com/googleapis/dotnet-spanner-entity-framework.gitMude para o diretório que contém o exemplo de código do driver ADO.NET do Spanner:
cd dotnet-spanner-entity-framework/spanner-ado-net/spanner-ado-net-getting-started-guide
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 ADO.NET.
Confira o arquivoSampleRunner.cs, 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
gcloud spanner databases create example-db --instance=test-instance
PostgreSQL
gcloud spanner databases create example-db --instance=test-instance \
--database-dialect=POSTGRESQL
Você verá:
Creating database...done.
crie tabelas
O código a seguir cria duas tabelas no banco de dados.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run createtables projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run createtablespg projects/PROJECT_ID/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, é preciso criar uma conexão para interagir com o Spanner. O nome do banco de dados e outras propriedades de conexão são especificados na string de conexão do ADO.NET.GoogleSQL
PostgreSQL
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 DbCommand#ExecuteNonQuery para executar uma instrução DML.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run dmlwrite projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run dmlwritepg projects/PROJECT_ID/instances/test-instance/databases/example-db
O resultado vai mostrar:
4 records inserted.
Gravar dados com mutações
Também é possível inserir dados usando mutações.
É possível inserir dados usando o método batch.CreateInsertCommand(),
que cria um novo SpannerBatchCommand para inserir linhas em uma tabela.
O método SpannerBatchCommand.ExecuteNonQueryAsync() adiciona novas linhas
à tabela.
O código a seguir mostra como gravar dados usando mutações:
GoogleSQL
PostgreSQL
Execute o exemplo a seguir usando o argumento write:
GoogleSQL
dotnet run write projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run writepg projects/PROJECT_ID/instances/test-instance/databases/example-db
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 o driver ADO.NET do Spanner.
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'
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
Usar o driver ADO.NET 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 ADO.NET do Spanner.
Os seguintes métodos são usados para executar uma consulta SQL:- O método
ExecuteReaderna classeDbCommand: use-o para executar uma instrução SQL que retorna linhas, como uma consulta ou uma instrução DML com uma cláusulaTHEN RETURN. - A classe
DbDataReader: use para acessar os dados retornados por uma instrução SQL.
O exemplo a seguir usa o método ExecuteReaderAsync:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run query projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run querypg projects/PROJECT_ID/instances/test-instance/databases/example-db
O resultado vai mostrar:
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.
O driver ADO.NET 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. Adicione valores de parâmetro de consulta ao Parameters do
DbCommand. Exemplo:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run querywithparameter projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run querywithparameterpg projects/PROJECT_ID/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. 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 o driver ADO.NET do Spanner.
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 marketing_budget bigint'
Você verá:
Schema updating...done.
Usar o driver ADO.NET do Spanner
Use o métodoExecuteNonQueryAsync para modificar o esquema:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run addcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run addcolumnpg projects/PROJECT_ID/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
o método CreateBatch do ADO.NET para criar um lote. O exemplo
a seguir cria duas tabelas em um lote:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run ddlbatch projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run ddlbatchpg projects/PROJECT_ID/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 chave de linha Albums(1, 1) e como 500000 para a chave de linha
Albums(2, 2).
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run update projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run updatepg projects/PROJECT_ID/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 o método ExecuteReaderAsync para executar uma consulta:
GoogleSQL
PostgreSQL
Para executar essa consulta, use o seguinte comando:
GoogleSQL
dotnet run querymarketingbudget projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run querymarketingbudgetpg 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.
Chame connection.BeginTransactionAsync() para executar transações de leitura e gravação no
ADO.NET.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run writewithtransactionusingdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run writewithtransactionusingdmlpg projects/PROJECT_ID/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 de transações e consultas no Spanner. É possível definir tags em objetos Transaction para enviar tags de transação e objetos DbCommand para enviar tags de solicitação ao Spanner. Exemplo:
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run tags projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run tagspg projects/PROJECT_ID/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.
Chame connection.BeginReadOnlyTransactionAsync() para executar uma transação somente leitura.
Veja a seguir como executar uma consulta e fazer uma leitura na mesma transação somente leitura.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run readonlytransaction projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run readonlytransactionpg projects/PROJECT_ID/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
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.
GoogleSQL
PostgreSQL
Execute o exemplo com o seguinte comando:
GoogleSQL
dotnet run pdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run pdmlpg projects/PROJECT_ID/instances/test-instance/databases/example-db
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.