Persistance des données Python - Pilote Cassandra

Cassandra est une autre base de données NoSQL populaire. Évolutivité, cohérence et tolérance aux pannes élevées - ce sont quelques-unes des caractéristiques importantes de Cassandra. C'estColumn storebase de données. Les données sont stockées sur de nombreux serveurs de base. En conséquence, les données sont hautement disponibles.

Cassandra est un produit de la fondation Apache Software. Les données sont stockées de manière distribuée sur plusieurs nœuds. Chaque nœud est un serveur unique composé d'espaces de clés. La pierre angulaire de la base de données Cassandra estkeyspace qui peut être considéré comme analogue à une base de données.

Les données dans un nœud de Cassandra sont répliquées dans d'autres nœuds sur un réseau de nœuds peer-to-peer. Cela fait de Cassandra une base de données infaillible. Le réseau s'appelle un centre de données. Plusieurs centres de données peuvent être interconnectés pour former un cluster. La nature de la réplication est configurée en définissant la stratégie de réplication et le facteur de réplication au moment de la création d'un espace de clés.

Un espace de clés peut avoir plusieurs familles de colonnes - tout comme une base de données peut contenir plusieurs tables. L'espace de clés de Cassandra n'a pas de schéma prédéfini. Il est possible que chaque ligne d'une table Cassandra ait des colonnes avec des noms différents et des nombres variables.

Le logiciel Cassandra est également disponible en deux versions: communauté et entreprise. La dernière version entreprise de Cassandra est disponible en téléchargement surhttps://cassandra.apache.org/download/. L'édition communautaire se trouve surhttps://academy.datastax.com/planet-cassandra/cassandra.

Cassandra a son propre langage de requête appelé Cassandra Query Language (CQL). Les requêtes CQL peuvent être exécutées à partir d'un shell CQLASH - similaire au shell MySQL ou SQLite. La syntaxe CQL ressemble à celle du SQL standard.

L'édition communautaire Datastax est également livrée avec un IDE Develcenter illustré dans la figure suivante -

Le module Python pour travailler avec la base de données Cassandra est appelé Cassandra Driver. Il est également développé par la fondation Apache. Ce module contient une API ORM, ainsi qu'une API principale de même nature que DB-API pour les bases de données relationnelles.

L'installation du pilote Cassandra se fait facilement en utilisant pip utility.

pip3 install cassandra-driver

L'interaction avec la base de données Cassandra se fait via l'objet Cluster. Le module Cassandra.cluster définit la classe de cluster. Nous devons d'abord déclarer l'objet Cluster.

from cassandra.cluster import Cluster
clstr=Cluster()

Toutes les transactions telles que l'insertion / la mise à jour, etc., sont effectuées en démarrant une session avec un espace de clés.

session=clstr.connect()

Pour créer un nouvel espace de clés, utilisez execute()méthode de l'objet de session. La méthode execute () prend un argument de chaîne qui doit être une chaîne de requête. Le CQL a l'instruction CREATE KEYSPACE comme suit. Le code complet est comme ci-dessous -

from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect()
session.execute(“create keyspace mykeyspace with replication={
   'class': 'SimpleStrategy', 'replication_factor' : 3
};”

Ici, SimpleStrategy est une valeur pour replication strategy et replication factorest défini sur 3. Comme mentionné précédemment, un espace de clés contient une ou plusieurs tables. Chaque table est caractérisée par son type de données. Les types de données Python sont automatiquement analysés avec les types de données CQL correspondants conformément au tableau suivant -

Type de Python Type CQL
Aucun NUL
Booléen Booléen
Flotte flotteur, double
int, long int, bigint, varint, smallint, tinyint, compteur
décimal.Décimal Décimal
str, Unicode ascii, varchar, texte
tampon, bytearray Goutte
Date Date
Datetime Horodatage
Temps Temps
liste, tuple, générateur liste
ensemble, frozenset Ensemble
dict, OrderedDict Carte
uuid.UUID timeuuid, uuid

Pour créer une table, utilisez l'objet session pour exécuter une requête CQL pour créer une table.

from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect('mykeyspace')
qry= '''
create table students (
   studentID int,
   name text,
   age int,
   marks int,
   primary key(studentID)
);'''
session.execute(qry)

L'espace de clés ainsi créé peut être utilisé pour insérer des lignes. La version CQL de la requête INSERT est similaire à l'instruction SQL Insert. Le code suivant insère une ligne dans la table des étudiants.

from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect('mykeyspace')
session.execute("insert into students (studentID, name, age, marks) values 
   (1, 'Juhi',20, 200);"

Comme vous vous en doutez, l'instruction SELECT est également utilisée avec Cassandra. Dans le cas de la méthode execute () contenant la chaîne de requête SELECT, elle retourne un objet de jeu de résultats qui peut être parcouru à l'aide d'une boucle.

from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect('mykeyspace')
rows=session.execute("select * from students;")
for row in rows:
print (StudentID: {} Name:{} Age:{} price:{} Marks:{}'
   .format(row[0],row[1], row[2], row[3]))

La requête SELECT de Cassandra prend en charge l'utilisation de la clause WHERE pour appliquer un filtre sur l'ensemble de résultats à extraire. Les opérateurs logiques traditionnels tels que <,> == etc. sont reconnus. Pour récupérer, uniquement les lignes de la table des étudiants pour les noms d'âge> 20 ans, la chaîne de requête de la méthode execute () doit être la suivante -

rows=session.execute("select * from students WHERE age>20 allow filtering;")

Notez que l'utilisation de ALLOW FILTERING. La partie ALLOW FILTERING de cette instruction permet d'autoriser explicitement (certaines) requêtes qui nécessitent un filtrage.

L'API du pilote Cassandra définit les classes suivantes de type Statement dans son module cassendra.query.

SimpleStatement

Une requête CQL simple et non préparée contenue dans une chaîne de requête. Tous les exemples ci-dessus sont des exemples de SimpleStatement.

BatchStatement

Plusieurs requêtes (telles que INSERT, UPDATE et DELETE) sont placées dans un lot et exécutées en même temps. Chaque ligne est d'abord convertie en SimpleStatement, puis ajoutée dans un lot.

Mettons les lignes à ajouter dans la table Students sous la forme d'une liste de tuples comme suit -

studentlist=[(1,'Juhi',20,100), ('2,'dilip',20, 110),(3,'jeevan',24,145)]

Pour ajouter les lignes ci-dessus à l'aide de BathStatement, exécutez le script suivant -

from cassandra.query import SimpleStatement, BatchStatement
batch=BatchStatement()
for student in studentlist:
   batch.add(SimpleStatement("INSERT INTO students 
      (studentID, name, age, marks) VALUES
      (%s, %s, %s %s)"), (student[0], student[1],student[2], student[3]))
session.execute(batch)

Affirmation préparée

L'instruction préparée est comme une requête paramétrée dans DB-API. Sa chaîne de requête est enregistrée par Cassandra pour une utilisation ultérieure. La méthode Session.prepare () retourne une instance PreparedStatement.

Pour notre table des étudiants, une requête PreparedStatement for INSERT est la suivante -

stmt=session.prepare("INSERT INTO students (studentID, name, age, marks) VALUES (?,?,?)")

Par la suite, il suffit d'envoyer les valeurs des paramètres à lier. Par exemple -

qry=stmt.bind([1,'Ram', 23,175])

Enfin, exécutez l'instruction liée ci-dessus.

session.execute(qry)

Cela réduit le trafic réseau et l'utilisation du processeur car Cassandra n'a pas à réanalyser la requête à chaque fois.