Persistencia de datos de Python: controlador Cassandra

Cassandra es otra base de datos NoSQL popular. Alta escalabilidad, consistencia y tolerancia a fallas: estas son algunas de las características importantes de Cassandra. Esto esColumn storebase de datos. Los datos se almacenan en muchos servidores de productos básicos. Como resultado, datos de alta disponibilidad.

Cassandra es un producto de la fundación Apache Software. Los datos se almacenan de forma distribuida en varios nodos. Cada nodo es un único servidor que consta de espacios de claves. El bloque de construcción fundamental de la base de datos Cassandra eskeyspace que puede considerarse análogo a una base de datos.

Los datos de un nodo de Cassandra se replican en otros nodos a través de una red de nodos de igual a igual. Eso convierte a Cassandra en una base de datos infalible. La red se llama centro de datos. Se pueden interconectar varios centros de datos para formar un clúster. La naturaleza de la replicación se configura estableciendo la estrategia de replicación y el factor de replicación en el momento de la creación de un espacio de claves.

Un espacio de claves puede tener más de una familia de columnas, al igual que una base de datos puede contener varias tablas. El espacio de claves de Cassandra no tiene un esquema predefinido. Es posible que cada fila de una tabla de Cassandra tenga columnas con diferentes nombres y números variables.

El software Cassandra también está disponible en dos versiones: comunitaria y empresarial. La última versión empresarial de Cassandra está disponible para descargar enhttps://cassandra.apache.org/download/. La edición comunitaria se encuentra enhttps://academy.datastax.com/planet-cassandra/cassandra.

Cassandra tiene su propio lenguaje de consulta llamado Cassandra Query Language (CQL). Las consultas CQL se pueden ejecutar desde dentro de un shell CQLASH, similar al shell MySQL o SQLite. La sintaxis de CQL parece similar a SQL estándar.

La edición comunitaria de Datastax también viene con un IDE de Develcenter que se muestra en la siguiente figura:

El módulo de Python para trabajar con la base de datos Cassandra se llama Cassandra Driver. También es desarrollado por la fundación Apache. Este módulo contiene una API ORM, así como una API central similar en naturaleza a DB-API para bases de datos relacionales.

La instalación del controlador Cassandra se realiza fácilmente usando pip utility.

pip3 install cassandra-driver

La interacción con la base de datos de Cassandra, se realiza a través del objeto Cluster. El módulo Cassandra.cluster define la clase Cluster. Primero necesitamos declarar el objeto Cluster.

from cassandra.cluster import Cluster
clstr=Cluster()

Todas las transacciones, como insertar / actualizar, etc., se realizan iniciando una sesión con un espacio de teclas.

session=clstr.connect()

Para crear un nuevo espacio de teclas, use execute()método de objeto de sesión. El método execute () toma un argumento de cadena que debe ser una cadena de consulta. El CQL tiene la instrucción CREATE KEYSPACE de la siguiente manera. El código completo es el siguiente:

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

Aquí, SimpleStrategy es un valor para replication strategy y replication factorse establece en 3. Como se mencionó anteriormente, un espacio de claves contiene una o más tablas. Cada tabla se caracteriza por su tipo de datos. Los tipos de datos de Python se analizan automáticamente con los tipos de datos CQL correspondientes de acuerdo con la siguiente tabla:

Tipo de Python Tipo de CQL
Ninguna NULO
Bool Booleano
Flotador flotar, doble
int, largo int, bigint, varint, smallint, tinyint, mostrador
decimal.Decimal Decimal
str, Unicode ascii, varchar, texto
búfer, bytearray Gota
Fecha Fecha
Fecha y hora Marca de tiempo
Hora Hora
lista, tupla, generador Lista
conjunto, congelado Conjunto
dict, OrderedDict Mapa
uuid.UUID timeuuid, uuid

Para crear una tabla, use el objeto de sesión para ejecutar la consulta CQL para crear una tabla.

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)

El espacio de claves así creado se puede utilizar para insertar filas. La versión CQL de la consulta INSERT es similar a la instrucción SQL Insert. El siguiente código inserta una fila en la tabla de estudiantes.

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

Como era de esperar, la instrucción SELECT también se usa con Cassandra. En el caso de que el método execute () contenga una cadena de consulta SELECT, devuelve un objeto de conjunto de resultados que se puede recorrer mediante un bucle.

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 consulta SELECT de Cassandra admite el uso de la cláusula WHERE para aplicar un filtro en el conjunto de resultados que se va a obtener. Se reconocen los operadores lógicos tradicionales como <,> ==, etc. Para recuperar, solo aquellas filas de la tabla de estudiantes para nombres con edad> 20, la cadena de consulta en el método execute () debe ser la siguiente:

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

Tenga en cuenta, el uso de ALLOW FILTERING. La parte PERMITIR EL FILTRADO de esta declaración permite permitir explícitamente (algunas) consultas que requieren filtrado.

La API del controlador Cassandra define las siguientes clases de tipo de declaración en su módulo cassendra.query.

SimpleStatement

Una consulta CQL simple y no preparada contenida en una cadena de consulta. Todos los ejemplos anteriores son ejemplos de SimpleStatement.

BatchStatement

Varias consultas (como INSERT, UPDATE y DELETE) se colocan en un lote y se ejecutan a la vez. Cada fila se convierte primero como un SimpleStatement y luego se agrega en un lote.

Pongamos las filas que se agregarán en la tabla de Estudiantes en forma de lista de tuplas de la siguiente manera:

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

Para agregar las filas anteriores usando BathStatement, ejecute el siguiente 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)

Declaración preparada

La declaración preparada es como una consulta parametrizada en DB-API. Cassandra guarda su cadena de consulta para su uso posterior. El método Session.prepare () devuelve una instancia de PreparedStatement.

Para nuestra tabla de estudiantes, una consulta PreparedStatement para INSERT es la siguiente:

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

Posteriormente, solo necesita enviar los valores de los parámetros para enlazar. Por ejemplo

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

Finalmente, ejecute la declaración enlazada anterior.

session.execute(qry)

Esto reduce el tráfico de red y la utilización de la CPU porque Cassandra no tiene que volver a analizar la consulta cada vez.