Persistenza dei dati Python - Driver Cassandra

Cassandra è un altro popolare database NoSQL. Elevata scalabilità, coerenza e tolleranza agli errori: queste sono alcune delle caratteristiche importanti di Cassandra. Questo èColumn storeBanca dati. I dati vengono archiviati su molti server di prodotti. Di conseguenza, dati altamente disponibili.

Cassandra è un prodotto della fondazione Apache Software. I dati vengono archiviati in modo distribuito su più nodi. Ogni nodo è un singolo server costituito da spazi delle chiavi. Il blocco costitutivo fondamentale del database Cassandra èkeyspace che può essere considerato analogo a un database.

I dati in un nodo di Cassandra vengono replicati in altri nodi su una rete di nodi peer-to-peer. Questo rende Cassandra un database infallibile. La rete è chiamata data center. Più data center possono essere interconnessi per formare un cluster. La natura della replica viene configurata impostando la strategia di replica e il fattore di replica al momento della creazione di uno spazio delle chiavi.

Uno spazio chiavi può avere più di una famiglia di colonne, proprio come un database può contenere più tabelle. Il keyspace di Cassandra non ha uno schema predefinito. È possibile che ogni riga in una tabella Cassandra possa avere colonne con nomi diversi e in numeri variabili.

Il software Cassandra è disponibile anche in due versioni: community e enterprise. L'ultima versione Enterprise di Cassandra è disponibile per il download all'indirizzohttps://cassandra.apache.org/download/. L'edizione comunitaria si trova all'indirizzohttps://academy.datastax.com/planet-cassandra/cassandra.

Cassandra ha il proprio linguaggio di query chiamato Cassandra Query Language (CQL). Le query CQL possono essere eseguite dall'interno di una shell CQLASH, simile alla shell MySQL o SQLite. La sintassi CQL sembra simile a SQL standard.

L'edizione della community di Datastax, inoltre, viene fornita con un IDE Develcenter mostrato nella figura seguente:

Viene chiamato il modulo Python per lavorare con il database Cassandra Cassandra Driver. È anche sviluppato dalla fondazione Apache. Questo modulo contiene un'API ORM, nonché un'API di base di natura simile a DB-API per database relazionali.

L'installazione del driver Cassandra viene eseguita facilmente utilizzando pip utility.

pip3 install cassandra-driver

L'interazione con il database Cassandra, avviene tramite oggetto Cluster. Il modulo Cassandra.cluster definisce la classe Cluster. Dobbiamo prima dichiarare l'oggetto Cluster.

from cassandra.cluster import Cluster
clstr=Cluster()

Tutte le transazioni come inserimento / aggiornamento, ecc. Vengono eseguite avviando una sessione con un keyspace.

session=clstr.connect()

Per creare un nuovo keyspace, usa execute()metodo dell'oggetto sessione. Il metodo execute () accetta un argomento stringa che deve essere una stringa di query. Il CQL ha l'istruzione CREATE KEYSPACE come segue. Il codice completo è il seguente:

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

Qui, SimpleStrategy è un valore per replication strategy e replication factorè impostato su 3. Come accennato in precedenza, uno spazio delle chiavi contiene una o più tabelle. Ogni tabella è caratterizzata dal tipo di dati. I tipi di dati Python vengono automaticamente analizzati con i tipi di dati CQL corrispondenti in base alla tabella seguente:

Tipo Python Tipo CQL
Nessuna NULLO
Bool Booleano
Galleggiante galleggiante, doppio
int, lungo int, bigint, varint, smallint, tinyint, counter
decimal.Decimal Decimale
str, Unicode ascii, varchar, text
buffer, bytearray Blob
Data Data
Appuntamento Timestamp
Tempo Tempo
lista, tupla, generatore Elenco
set, frozenset Impostato
dict, OrderedDict Carta geografica
uuid.UUID timeuuid, uuid

Per creare una tabella, utilizzare l'oggetto sessione per eseguire la query CQL per la creazione di una tabella.

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)

Lo spazio delle chiavi così creato può essere ulteriormente utilizzato per inserire righe. La versione CQL della query INSERT è simile all'istruzione SQL Insert. Il codice seguente inserisce una riga nella tabella degli studenti.

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);"

Come ci si aspetterebbe, l'istruzione SELECT viene utilizzata anche con Cassandra. In caso di metodo execute () contenente la stringa di query SELECT, restituisce un oggetto set di risultati che può essere attraversato utilizzando un ciclo.

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 query SELECT di Cassandra supporta l'uso della clausola WHERE per applicare il filtro sul set di risultati da recuperare. Vengono riconosciuti operatori logici tradizionali come <,> == ecc. Per recuperare, solo quelle righe dalla tabella degli studenti per i nomi con età> 20, la stringa di query nel metodo execute () dovrebbe essere la seguente:

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

Nota, l'uso di ALLOW FILTERING. La parte ALLOW FILTERING di questa istruzione consente di consentire esplicitamente (alcune) query che richiedono il filtraggio.

L'API del driver Cassandra definisce le seguenti classi di tipo Statement nel modulo cassendra.query.

SimpleStatement

Una query CQL semplice e non preparata contenuta in una stringa di query. Tutti gli esempi precedenti sono esempi di SimpleStatement.

BatchStatement

Più query (come INSERT, UPDATE e DELETE) vengono inserite in un batch ed eseguite contemporaneamente. Ogni riga viene prima convertita come SimpleStatement e quindi aggiunta in un batch.

Mettiamo le righe da aggiungere nella tabella Studenti sotto forma di elenco di tuple come segue:

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

Per aggiungere le righe sopra utilizzando BathStatement, eseguire il seguente script:

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)

Discorso preparato

L'istruzione preparata è come una query con parametri in DB-API. La sua stringa di query viene salvata da Cassandra per un uso successivo. Il metodo Session.prepare () restituisce un'istanza PreparedStatement.

Per la nostra tabella studenti, una query PreparedStatement per INSERT è la seguente:

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

Successivamente, deve solo inviare i valori dei parametri da associare. Ad esempio:

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

Infine, esegui l'istruzione legata sopra.

session.execute(qry)

Ciò riduce il traffico di rete e l'utilizzo della CPU perché Cassandra non deve analizzare nuovamente la query ogni volta.