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. As mutações são projetadas para gravar dados. Elas não podem ler dados das tabelas. Muitas operações de atualização precisam ler dados atuais antes de fazer modificações. Para esses casos de uso, é necessário usar uma transação de leitura/gravação, que permite que o Spanner leia linhas e aplique mutações na mesma operação atômica.
É possível confirmar mutações usando gRPC ou REST, mas é mais comum acessar as APIs por meio das bibliotecas de cliente.
Se você precisar confirmar um grande número de gravações cegas, mas não exigir uma transação atômica, modifique suas tabelas do Spanner em massa usando a 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 ou exclusões que podem ser aplicadas atomicamente a diferentes linhas e tabelas em um banco de dados do Spanner.
Use Mutation.InsertOrUpdate()
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 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.
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 valores de coluna caso a linha já exista.
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 ou exclusões que podem ser aplicadas atomicamente a diferentes linhas e tabelas em um banco de dados do Spanner.
O método insert() 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).
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 mais recentes, use o framework .NET's
TransactionScope() 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 Transaction propriedade 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(),
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 Key
tipo (em inglês), 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 a classe Struct, que é útil para
armazenar os resultados das chamadas readRow(). O exemplo também usa a
Key classe, que representa uma chave de linha em uma tabela ou índice do Spanner.
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 run_in_transaction()
método da Database
classe 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 em 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 CASCADEna 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() método, que
cria um novo SpannerCommand para excluir linhas. O método
SpannerCommand.ExecuteNonQueryAsync() 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.
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 Albums
tabela, o exemplo exclui as linhas na tabela Singers individualmente
usando chaves criadas com o método KeySet.singleKey().
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.
Ruby
Exclua linhas usando o método Client#delete (em inglês). A página de Client#delete (em inglês) inclui um exemplo.