Nesta página, descrevemos como inserir, atualizar e excluir dados usando mutações. Uma mutação 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.
É possível confirmar mutações usando gRPC ou REST, mas é mais comum acessar as APIs por meio das bibliotecas de cliente.
Nesta página, mostramos as tarefas básicas de inserir, atualizar e excluir. É possível encontrar mais exemplos nos tutoriais de primeiros passos.
Se você precisar executar commit de um grande número de gravações cegas sem precisar atômica, é possível modificar em massa as tabelas do Spanner usando gravação em lote. Para mais informações, consulte Modificar dados usando gravações em lote.
Inserir novas linhas em uma tabela
C++
É possível gravar dados usando a função InsertMutationBuilder()
.
Client::Commit()
adiciona novas linhas a uma tabela. Todas as inserções em um único lote são aplicadas atomicamente.
Este código mostra como gravar os dados:
C#
É 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:
Go
Grave dados usando um Mutation
(em inglês). Um Mutation
é um contêiner para operações de mutação. Um Mutation
representa uma sequência de
inserções, atualizações, exclusões e outras ações que podem ser aplicadas 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 os dados:
Java
Grave dados usando um objeto Mutation
(em inglês). Um objeto Mutation
é um contêiner para operações de mutação. Um Mutation
representa
sequência de inserções, atualizações e exclusões que o Spanner aplica
atomicamente em diferentes linhas e tabelas em um banco de dados do Spanner.
O método newInsertBuilder()
na classe Mutation
constrói uma mutação INSERT
, que insere uma nova
linha em uma tabela. Se a linha já existir, a gravação falhará. Como alternativa,
use o método newInsertOrUpdateBuilder
para construir uma mutação INSERT_OR_UPDATE
, que
atualiza os valores da coluna se a linha já existir.
O método write()
(em inglês) na classe DatabaseClient
grava as mutações. Todas as mutações em um único lote são aplicadas atomicamente.
Este código mostra como gravar os dados:
Node.js
Grave dados usando um objeto Table
(em inglês). O método Table.insert()
(em inglês) adiciona novas linhas à tabela. Todas as inserções em um único lote são aplicadas atomicamente.
Este código mostra como gravar os dados:
PHP
Grave dados usando o método Database::insertBatch
(em inglês). insertBatch
adiciona novas linhas a uma tabela. Todas as inserções em um único lote são aplicadas atomicamente.
Este código mostra como gravar os dados:
Python
Grave dados usando um objeto Batch
(em inglês). Um objeto Batch
é um contêiner para operações de mutação. Uma mutação representa uma sequência de
inserções, atualizações, exclusões etc. que podem ser aplicadas atomicamente
diferentes linhas e tabelas
em um banco de dados do Spanner.
O método insert()
(em inglês) na classe Batch
é usado para adicionar uma ou mais mutações de inserção ao lote. Todas as mutações em um único lote são aplicadas atomicamente.
Este código mostra como gravar os dados:
Ruby
Grave dados usando um objeto Client
. O método Client#commit
(em inglês) cria e confirma uma transação para gravações que são executadas atomicamente em um único ponto lógico no tempo em colunas, linhas e tabelas em um banco de dados.
Este código mostra como gravar os dados:
Atualizar linhas em uma tabela
Imagine que as vendas de Albums(1, 1)
sejam menores do que o esperado. Como resultado, você quer transferir US$ 200.000 do orçamento de marketing de Albums(2, 2)
para Albums(1, 1)
, mas apenas se o dinheiro estiver disponível no orçamento de Albums(2, 2)
.
Como você precisa ler os dados nas tabelas para determinar se grava ou não novos valores, use uma transação de leitura e gravação para executar as leituras e gravações atomicamente.
C++
Use a função Transaction()
para executar uma transação para um cliente.
Veja o código para executar a transação:
C#
Para o .NET Standard 2.0 (ou .NET 4.5) e versões posteriores, use a estrutura .NET
TransactionScope()
(em inglês) para executar uma transação. Para todas as versões compatíveis do .NET, crie uma transação definindo o resultado de SpannerConnection.BeginTransactionAsync
como a propriedade Transaction
de SpannerCommand
.
Veja duas maneiras de executar a transação:
.NET Standard 2.0
.NET Standard 1.5
Go
Use o tipo ReadWriteTransaction
(em inglês) para executar um corpo de trabalho no contexto de uma transação de leitura e gravação.
Client.ReadWriteTransaction()
(em inglês)
retorna um objeto ReadWriteTransaction
.
A amostra usa ReadWriteTransaction.ReadRow()
(em inglês) para recuperar uma linha de dados.
O exemplo também usa ReadWriteTransaction.BufferWrite()
(em inglês), que adiciona uma lista de mutações ao conjunto de atualizações que serão aplicadas quando a transação for concluída.
O exemplo também usa o tipo Key
,
que representa uma chave de linha em uma tabela ou índice do Spanner.
Java
Use a interface TransactionRunner
(em inglês) para executar um corpo de trabalho no contexto de uma transação de leitura e gravação. Essa interface contém o método run()
(em inglês), que é usado para executar uma transação de leitura e gravação, com novas tentativas conforme necessário. O método readWriteTransaction
(em inglês) da classe DatabaseClient
retorna um objeto TransactionRunner
para executar uma única transação lógica.
A classe TransactionRunner.TransactionCallable
(em inglês) contém um método run()
para realizar uma única tentativa de uma transação. run()
leva um objeto TransactionContext
(em inglês), que é um contexto para uma transação.
A amostra usa o Struct
(em inglês) que é útil para armazenar os resultados das chamadas readRow()
. O exemplo também usa o
Classe Key
, que representa uma chave de linha em um Spanner
tabela ou índice.
Veja o código para executar a transação:
Node.js
Use Database.runTransaction()
(em inglês) para executar uma transação.
Veja o código para executar a transação:
PHP
Use Database::runTransaction
(em inglês) para executar uma transação.
Veja o código para executar a transação:
Python
Use o método run_in_transaction()
da classe Database
(links em inglês) para executar uma transação.
Veja o código para executar a transação:
Ruby
Use o método transaction
da classe Client
(links em inglês) para executar uma transação.
Veja o código para executar a transação:
Excluir linhas de uma tabela
Cada biblioteca de cliente fornece várias maneiras de excluir linhas:
- Exclua todas as linhas de uma tabela.
- Exclua uma única linha especificando os valores de coluna da chave para a linha.
- Exclua um grupo de linhas criando um intervalo de chaves.
- Exclua linhas em uma tabela intercalada excluindo as linhas pai, se a tabela intercalada incluir
ON DELETE CASCADE
na definição do esquema.
C++
Exclua linhas usando a função DeleteMutationBuilder()
para um cliente.
Este código mostra como excluir os dados:
C#
Exclua linhas usando o connection.CreateDeleteCommand()
(em inglês), que cria um novo SpannerCommand
para excluir linhas. O método SpannerCommand.ExecuteNonQueryAsync()
(em inglês) exclui as linhas da tabela.
Este exemplo exclui as linhas na tabela Singers
individualmente. As linhas na tabela Albums
são excluídas porque a tabela Albums
é intercalada na tabela Singers
e é definida com ON DELETE CASCADE
.
Go
Exclua linhas usando um Mutation
(em inglês). Use o método Mutation.Delete()
(em inglês) para construir uma mutação DELETE
, que exclui uma linha. O método Client.Apply()
(em inglês) aplica mutações atomicamente ao banco de dados.
Este exemplo exclui as linhas na tabela Albums
individualmente e, em seguida, exclui todas as linhas na tabela Singers
usando um KeyRange (em inglês).
Java
Exclua linhas usando o método Mutation.delete()
(em inglês).
Este exemplo usa o método KeySet.all()
(em inglês) para excluir todas as linhas da tabela Albums
. Depois de excluir as linhas na tabela Albums
, o exemplo exclui as linhas na tabela Singers
individualmente usando chaves criadas com o método KeySet.singleKey()
(em inglês).
Node.js
Exclua linhas usando o método table.deleteRows()
(em inglês).
Este exemplo usa o método table.deleteRows()
para excluir todas as linhas da tabela Singers
. As linhas na tabela Albums
são excluídas porque a tabela Albums
é intercalada na tabela Singers
e é definida com ON
DELETE CASCADE
.
PHP
Exclua linhas usando Database::delete() method
(em inglês). A página do método Database::delete()
(em inglês) inclui um exemplo.
Python
Exclua linhas usando o método Batch.delete()
(em inglês).
Este exemplo exclui todas as linhas nas tabelas Albums
e Singers
individualmente usando um objeto KeySet
(em inglês).
Ruby
Exclua linhas usando o método Client#delete
(em inglês). A página de Client#delete
(em inglês) inclui um exemplo.