Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Les Azure Table, vision développeur

Poster un commentaire

Après les Azure Service Bus QUEUE, un petit tour du côté des Table dont l’architecture a été présentée ici:

https://amethyste16.wordpress.com/2015/05/21/focus-sur-le-stockage-azure/

Création d’un compte de stockage

Le compte de stockage est le point d’entrée aux services de stockage. On le créée depuis le portail:

2016-05-16_18-51-50

 

Le nom du storage DOIT être en minuscules.

On récupère tout d’abord la chaîne de connexion. On se rend dans le menus ACCESS KEY:

2016-05-16_19-01-06

On clique sur Context menu (…) et la popin s’affiche avec la chaîne de connexion dont on aura besoin dans le code:

2016-05-16_19-03-47

Création d’une table

On va partir d’une application Console complétée avec le package Nuget:

Install-Package WindowsAzure.Storage -pre

 

Le code suivant permet de créer une table dans le storage nouvelle créé:

string connexion = "DefaultEndpointsProtocol=https;AccountName=amethystetable;AccountKey=k0K7r6QE/...==";
  
var storageAccount = CloudStorageAccount.Parse(connexion);
var tableClient = storageAccount.CreateCloudTableClient();
 
CloudTable table = tableClient.GetTableReference("Personne");
table.CreateIfNotExists();

La ligne 3 obtient un proxy vers le compte de stockage. On construit ensuit un client TABLE capable d’opérer sur une TABLE.

La ligne 5 obtient une référence vers la TABLE appelée ‘Personne’ et la ligne 6 la construit dans le cas où elle n’existe pas déjà. Nous sommes prêt à travailler!

2016-05-16_19-16-21

Créer un enregistrement

Les opérations CRUD s’effectuent via une instance de TableEntity que nous créons:

class Personne: TableEntity
{
   public Personne(string pays, string societe)
   {
      PartitionKey = pays;
      RowKey = societe;
   }
 
   public string Nom { get; set; }
   public int Age { get; set; }
}

TableEntity expose deux propriétés importantes:

  • PartitionKey
  • RowKey

Tous les enregistrement contiennent ces valeurs dont la combinaison est unique.

Insérons maintenant un enregistrement:

Personne personne = new Personne("France", "Acme.fr");
personne.Nom = "Amethyste";
personne.Age = 52;
 
TableOperation operation = TableOperation.Insert(personne);
table.Execute(operation);

On construit une instance de Personne. TableOperation est un peu le BrokeredMessage des TABLE. Cette classe expose toutes les méthodes CRUD dont on peut avoir besoin. Nous utilisons Insert.

On réalise l’opération en appelant CloudTable.Execute.

Est-ce que ça marche?

2016-05-16_19-51-33

Apparemment oui.

 

Profitons en pour tester une particularité des TABLE en ajoutant ceci:


Film film = new Film("1", "Comédie");
film.Titre = "La Grande vadrouille";
TableOperation operation = TableOperation.Insert(film);
table.Execute(operation);

Et on a:

2016-05-17_00-23-01

On peut mélanger les types d’enregistrement dans une même table. On ne pourrait pas faire cela dans une base de données relationnelle SQL.

 

Execute est une opération coûteuse, on peut faire un traitement par lots à la place.

Personne personne1 = new Personne("France", "Acme.com");
personne1.Nom = "Amethyste";
personne1.Age = 52;
Personne personne2 = new Personne("France", "Acme.com");
personne2.Nom = "Super Man";
personne2.Age = 30;
 
TableBatchOperation tableBatchOperation = new TableBatchOperation();
 
tableBatchOperation.Insert(personne1);
tableBatchOperation.Insert(personne2);
 
table.ExecuteBatch(tableBatchOperation);

 

La classe TableBatchOperation va nous aider. Si vous lancez le code vous obtiendrez une StorageException.

The specified entity already exists.

 

La raison est que la combinaison RowKey + PartitionKey doit donner un résultat unique ce qui n’est pas le cas.

Cela montre surtout que le choix effectué n’est pas des plus judicieux, mais je voulais montrer quelque chose d’intéressant:

2016-05-16_19-51-33

Même si le premier enregistrement est correct, aucune opération n’a été enregistrée. ExecuteBatch est une opération transactionnelle.

Il existe une autre contrainte: la clef de partition de toutes les opérations d’un même lot doit être identique.

On obtient alors:

2016-05-16_20-18-08

Le traitement par lot n’est pas réservé à Insert, toutes les opérations CRUD sont concernées.

Rechercher un enregistrement

On peut lire dans une TABLE soit en recherchant sur les propriétés de la table, soit en recherchant avec la clef de partition et la clef de ligne. La dernière méthode est de loin la plus performante et doit être privilégiée.

 

La base de tout est le filtre. Par exemple si je recherche toutes les personnes de plus de 40 ans:

TableQuery<Personne> requete = new TableQuery<Personne>()
   .Where("Age gt 40");
 
 
var results = table.ExecuteQuery(requete);
foreach (Personne personne in results)
{
   Console.WriteLine(personne.Age);
}

 

Et il s’affiche:

2016-05-16_22-06-44

On peut également construire les filtres avec TableQuery.GenerateFilterCondition, mais je trouve plus simple de faire sans.

 

Bibliographie

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s