Cette page explique comment insérer, mettre à jour et supprimer des données en utilisant des mutations. A représente une séquence d'opérations (insertions, mises à jour, suppressions, etc.) Spanner s'applique de manière atomique à différentes lignes et tables d'une Spanner.
Même si vous pouvez effectuer un commit des mutations à l'aide de gRPC ou de REST, il est plus courant d'accéder aux API via les bibliothèques clientes.
Cette page présente les tâches de base permettant d'insérer, de mettre à jour et de supprimer des données. Vous trouverez plus d'exemples dans les tutoriels de prise en main.
Si vous devez valider un grand nombre d'écritures aveugles, mais que vous n'avez pas besoin d'une transaction atomique, vous pouvez modifier vos tables Spanner de manière groupée à l'aide d'une écriture par lot. Pour en savoir plus, consultez la page Modifier des données à l'aide d'écritures par lot.
Insérer de nouvelles lignes dans un tableau
C++
Vous pouvez écrire des données à l'aide de la fonction InsertMutationBuilder()
.
Client::Commit()
ajoute des lignes à une table. Toutes les insertions d'un même lot sont appliquées de manière atomique.
Ce code montre comment écrire les données :
C#
Vous pouvez insérer des données à l'aide de la méthode connection.CreateInsertCommand()
, qui crée une commande SpannerCommand
pour insérer des lignes dans une table. La méthode SpannerCommand.ExecuteNonQueryAsync()
ajoute des lignes à la table.
Le code suivant décrit comment insérer des données :
Go
Vous pouvez écrire des données à l'aide d'un objet Mutation
. L'objet Mutation
est un conteneur destiné aux opérations de mutation. Une Mutation
représente une séquence d'opérations (insertions, mises à jour, suppressions, etc.) pouvant être appliquées de manière atomique à différentes lignes et tables d'une base de données Spanner.
Utilisez Mutation.InsertOrUpdate()
pour créer une mutation INSERT_OR_UPDATE
, qui ajoute une ligne ou met à jour les valeurs de colonne si la ligne existe déjà. Autrement, vous pouvez aussi utiliser la méthode Mutation.Insert()
pour créer une mutation INSERT
, qui ajoute une ligne.
La méthode Client.Apply()
applique les mutations de manière atomique à une base de données.
Ce code montre comment écrire les données :
Java
Vous pouvez écrire des données à l'aide d'un objet Mutation
. L'objet Mutation
est un conteneur destiné aux opérations de mutation. Un Mutation
représente
séquence d'insertions, de mises à jour et de suppressions appliquées par Spanner
de manière atomique à différentes lignes et tables d'une base de données Spanner.
La méthode newInsertBuilder()
de la classe Mutation
crée une mutation INSERT
, qui insère une nouvelle ligne dans une table. Si la ligne existe déjà, l'écriture échoue. Autrement, vous pouvez aussi utiliser la méthode newInsertOrUpdateBuilder
pour créer une mutation INSERT_OR_UPDATE
, qui ajoute une ligne ou met à jour les valeurs de colonne si la ligne existe déjà.
La méthode write()
de la classe DatabaseClient
écrit les mutations. Toutes les mutations d'un même lot sont appliquées de manière atomique
Ce code montre comment écrire les données :
Node.js
Vous pouvez écrire des données à l'aide d'un objet Table
. La méthode Table.insert()
ajoute des lignes à la table. Toutes les insertions d'un même lot sont appliquées de manière atomique.
Ce code montre comment écrire les données :
PHP
Vous pouvez écrire des données à l'aide de la méthode Database::insertBatch
. insertBatch
ajoute des lignes à une table. Toutes les insertions d'un même lot sont appliquées de manière atomique.
Ce code montre comment écrire les données :
Python
Vous pouvez écrire des données à l'aide d'un objet Batch
. L'objet Batch
est un conteneur destiné aux opérations de mutation. Une mutation représente une séquence de
des insertions, des mises à jour, des suppressions, etc., pouvant être appliquées de manière atomique
avec différentes lignes et tables
dans une base de données Spanner.
La méthode insert()
de la classe Batch
permet d'ajouter une ou plusieurs mutations d'insertion au lot. Toutes les mutations d'un même lot sont appliquées de manière atomique.
Ce code montre comment écrire les données :
Ruby
Vous pouvez écrire des données à l'aide d'un objet Client
. La méthode Client#commit
permet la création et le commit d'une transaction pour les écritures, qui s'exécutent de manière atomique à un même instant logique dans les colonnes, les lignes et les tables d'une base de données.
Ce code montre comment écrire les données :
Mettre à jour les lignes d'une table
Supposons que les ventes enregistrées pour Albums(1, 1)
soient inférieures aux prévisions. Pour cette raison, vous souhaitez transférer 200 000 $ du budget marketing de Albums(2, 2)
vers Albums(1, 1)
, mais uniquement si la somme est disponible dans le budget de Albums(2, 2)
.
Étant donné que vous avez besoin de lire les données des tables pour déterminer si vous devez écrire de nouvelles valeurs, il vous faudra utiliser une transaction en lecture/écriture pour effectuer des lectures et des écritures de façon atomique.
C++
Utilisez la fonction Transaction()
pour exécuter une transaction pour un client.
Le code permettant d'exécuter la transaction est présenté ci-dessous :
C#
Pour .NET Standard 2.0 (ou .NET 4.5) et versions ultérieures, vous pouvez utiliser la méthode TransactionScope()
du framework .NET pour exécuter une transaction. Pour toutes les versions compatibles de .NET, vous pouvez créer une transaction en définissant le résultat de SpannerConnection.BeginTransactionAsync
en tant que propriété Transaction
de SpannerCommand
.
Voici deux méthodes permettant d'exécuter la transaction :
.NET Standard 2.0
.NET Standard 1.5
Go
Utilisez le type ReadWriteTransaction
pour exécuter un ensemble de tâches dans le contexte d'une transaction en lecture/écriture.
Client.ReadWriteTransaction()
renvoie un objet ReadWriteTransaction
.
L'exemple utilise ReadWriteTransaction.ReadRow()
pour récupérer une ligne de données.
Il inclut également ReadWriteTransaction.BufferWrite()
, qui ajoute une liste de mutations à l'ensemble des mises à jour qui seront appliquées lors du commit de la transaction.
L'exemple utilise également la méthode Key
qui représente une clé de ligne dans une table ou un index Spanner.
Java
Utilisez l'interface TransactionRunner
pour exécuter un ensemble de tâches dans le contexte d'une transaction en lecture/écriture. Cette interface contient la méthode run()
, qui permet d'exécuter une transaction en lecture/écriture, avec plusieurs tentatives si nécessaire. La méthode readWriteTransaction
de la classe DatabaseClient
renvoie un objet TransactionRunner
permettant d'exécuter une seule transaction logique.
La classe TransactionRunner.TransactionCallable
inclut une méthode run()
permettant d'effectuer une seule tentative de transaction. run()
utilise un objet TransactionContext
, qui correspond au contexte de la transaction.
L'exemple utilise la classe Struct
, qui s'avère pratique pour stocker les résultats des appels readRow()
. L'exemple utilise également la classe
La classe Key
, qui représente une clé de ligne dans une tâche Spanner
table ou index.
Le code permettant d'exécuter la transaction est présenté ci-dessous :
Node.js
Utilisez Database.runTransaction()
pour exécuter une transaction.
Le code permettant d'exécuter la transaction est présenté ci-dessous :
PHP
Utilisez Database::runTransaction
pour exécuter une transaction.
Le code permettant d'exécuter la transaction est présenté ci-dessous :
Python
Utilisez la méthode run_in_transaction()
de la classe Database
pour exécuter une transaction.
Le code permettant d'exécuter la transaction est présenté ci-dessous :
Ruby
Utilisez la méthode transaction
de la classe Client
pour exécuter une transaction.
Le code permettant d'exécuter la transaction est présenté ci-dessous :
Supprimer des lignes dans un tableau
Chaque bibliothèque client offre plusieurs moyens de supprimer des lignes :
- Supprimer toutes les lignes d'une table
- Supprimer une seule ligne en spécifiant les valeurs de colonne clé pour la ligne
- Supprimer un groupe de lignes en créant une plage de clés
- Supprimer des lignes dans une table entrelacée en supprimant les lignes parentes, si cette table inclut
ON DELETE CASCADE
dans sa définition de schéma
C++
Supprimez des lignes à l'aide de la fonction DeleteMutationBuilder()
pour un client.
Ce code montre comment supprimer les données :
C#
Supprimez des lignes à l'aide de la méthode connection.CreateDeleteCommand()
, qui crée une commande SpannerCommand
pour supprimer des lignes. La méthode SpannerCommand.ExecuteNonQueryAsync()
supprime les lignes de la table.
Cet exemple supprime les lignes de la table Singers
de manière individuelle. Les lignes de la table Albums
sont supprimées, car cette table Albums
est entrelacée dans la table Singers
et définie avec ON DELETE CASCADE
.
Go
Supprimez des lignes à l'aide d'un objet Mutation
. Utilisez la méthode Mutation.Delete()
pour créer une mutation DELETE
, qui supprime une ligne. La méthode Client.Apply()
applique des mutations de manière atomique à la base de données.
Cet exemple supprime les lignes de la table Albums
de manière individuelle, puis toutes les lignes de la table Singers
à l'aide d'un objet KeyRange.
Java
Supprimez des lignes à l'aide de la méthode Mutation.delete()
.
Cet exemple utilise la méthode KeySet.all()
pour supprimer toutes les lignes de la table Albums
. Après la suppression des lignes de la table Albums
, l'exemple supprime les lignes de la table Singers
de manière individuelle à l'aide des clés créées avec la méthode KeySet.singleKey()
.
Node.js
Supprimez des lignes à l'aide de la méthode table.deleteRows()
.
Cet exemple utilise la méthode table.deleteRows()
pour supprimer toutes les lignes de la table Singers
. Les lignes de la table Albums
sont supprimées, car cette table Albums
est entrelacée dans la table Singers
et définie avec ON
DELETE CASCADE
.
PHP
Supprimez des lignes à l'aide de la méthode Database::delete() method
. La page traitant de la méthode Database::delete()
inclut un exemple.
Python
Supprimez des lignes à l'aide de la méthode Batch.delete()
.
Cet exemple supprime toutes les lignes des tables Albums
et Singers
de manière individuelle à l'aide d'un objet KeySet
.
Ruby
Supprimez des lignes à l'aide de la méthode Client#delete
. La page traitant de Client#delete
inclut un exemple.