Python Data Persistence - Cassandra Driver

Cassandra é outro banco de dados NoSQL popular. Alta escalabilidade, consistência e tolerância a falhas - esses são alguns dos recursos importantes do Cassandra. Isto éColumn storebase de dados. Os dados são armazenados em muitos servidores de commodities. Como resultado, os dados estão altamente disponíveis.

Cassandra é um produto da Fundação Apache Software. Os dados são armazenados de maneira distribuída em vários nós. Cada nó é um único servidor que consiste em espaços-chave. O bloco de construção fundamental do banco de dados Cassandra ékeyspace que pode ser considerado análogo a um banco de dados.

Os dados em um nó do Cassandra são replicados em outros nós em uma rede ponto a ponto de nós. Isso torna Cassandra um banco de dados infalível. A rede é chamada de data center. Vários data centers podem ser interconectados para formar um cluster. A natureza da replicação é configurada definindo a estratégia de replicação e o fator de replicação no momento da criação de um keyspace.

Um keyspace pode ter mais de uma família de colunas - assim como um banco de dados pode conter várias tabelas. O keyspace de Cassandra não tem um esquema predefinido. É possível que cada linha de uma tabela do Cassandra tenha colunas com nomes diferentes e em números de variáveis.

O software Cassandra também está disponível em duas versões: comunidade e empresa. A última versão empresarial do Cassandra está disponível para download emhttps://cassandra.apache.org/download/. A edição da comunidade pode ser encontrada emhttps://academy.datastax.com/planet-cassandra/cassandra.

Cassandra tem sua própria linguagem de consulta chamada Cassandra Query Language (CQL). As consultas CQL podem ser executadas de dentro de um shell CQLASH - semelhante ao shell MySQL ou SQLite. A sintaxe CQL parece semelhante ao SQL padrão.

A edição da comunidade Datastax também vem com um IDE Developcenter mostrado na figura a seguir -

O módulo Python para trabalhar com o banco de dados Cassandra é chamado Cassandra Driver. Também é desenvolvido pela Fundação Apache. Este módulo contém uma API ORM, bem como uma API central de natureza semelhante à DB-API para bancos de dados relacionais.

A instalação do driver Cassandra é facilmente feita usando pip utility.

pip3 install cassandra-driver

A interação com o banco de dados do Cassandra, é feita através do objeto Cluster. O módulo Cassandra.cluster define a classe Cluster. Primeiro, precisamos declarar o objeto Cluster.

from cassandra.cluster import Cluster
clstr=Cluster()

Todas as transações, como inserir / atualizar, etc., são realizadas iniciando uma sessão com um keyspace.

session=clstr.connect()

Para criar um novo keyspace, use execute()método do objeto de sessão. O método execute () recebe um argumento de string que deve ser uma string de consulta. O CQL tem a instrução CREATE KEYSPACE da seguinte maneira. O código completo é o seguinte -

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

Aqui, SimpleStrategy é um valor para replication strategy e replication factoré definido como 3. Conforme mencionado anteriormente, um keyspace contém uma ou mais tabelas. Cada tabela é caracterizada por seu tipo de dados. Os tipos de dados Python são analisados ​​automaticamente com os tipos de dados CQL correspondentes de acordo com a tabela a seguir -

Tipo Python Tipo CQL
Nenhum NULO
Bool boleano
Flutuador flutuar, dobrar
int, longo int, bigint, varint, smallint, tinyint, counter
decimal.Decimal Decimal
str, Unicode ascii, varchar, text
buffer, bytearray Blob
Encontro Encontro
Data hora Timestamp
Tempo Tempo
lista, tupla, gerador Lista
definir, congelar Conjunto
dict, OrderedDict Mapa
uuid.UUID timeuuid, uuid

Para criar uma tabela, use o objeto de sessão para executar a consulta CQL para criar uma tabela.

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)

O keyspace assim criado pode ser usado posteriormente para inserir linhas. A versão CQL da consulta INSERT é semelhante à instrução SQL Insert. O código a seguir insere uma linha na tabela de alunos.

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 seria de se esperar, a instrução SELECT também é usada com Cassandra. No caso do método execute () contendo a string de consulta SELECT, ele retorna um objeto de conjunto de resultados que pode ser percorrido usando um loop.

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]))

A consulta SELECT do Cassandra suporta o uso da cláusula WHERE para aplicar o filtro no conjunto de resultados a ser obtido. Operadores lógicos tradicionais como <,> == etc. são reconhecidos. Para recuperar, apenas as linhas da tabela de alunos para nomes com idade> 20, a string de consulta no método execute () deve ser a seguinte -

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

Observe, o uso de ALLOW FILTERING. A parte ALLOW FILTERING desta instrução permite explicitamente permitir (algumas) consultas que requerem filtragem.

A API do driver Cassandra define as seguintes classes de tipo de instrução em seu módulo cassendra.query.

SimpleStatement

Uma consulta CQL simples e não preparada contida em uma string de consulta. Todos os exemplos acima são exemplos de SimpleStatement.

BatchStatement

Várias consultas (como INSERT, UPDATE e DELETE) são colocadas em um lote e executadas de uma vez. Cada linha é primeiro convertida como SimpleStatement e depois adicionada em um lote.

Vamos colocar as linhas a serem adicionadas na tabela Alunos na forma de lista de tuplas da seguinte forma -

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

Para adicionar linhas acima usando BathStatement, execute o seguinte 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)

Declaração preparada

A instrução preparada é como uma consulta parametrizada no DB-API. Sua string de consulta é salva pelo Cassandra para uso posterior. O método Session.prepare () retorna uma instância de PreparedStatement.

Para nossa tabela de alunos, uma instrução PreparedStatement para INSERT é a seguinte -

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

Posteriormente, ele só precisa enviar os valores dos parâmetros para vincular. Por exemplo -

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

Finalmente, execute a instrução vinculada acima.

session.execute(qry)

Isso reduz o tráfego de rede e a utilização da CPU porque o Cassandra não precisa analisar novamente a consulta todas as vezes.