Сохранение данных Python - драйвер Cassandra

Cassandra - еще одна популярная база данных NoSQL. Высокая масштабируемость, согласованность и отказоустойчивость - вот некоторые из важных особенностей Cassandra. ЭтоColumn storeбаза данных. Данные хранятся на многих обычных серверах. В результате данные высокодоступны.

Cassandra - продукт от Apache Software Foundation. Данные хранятся распределенным образом на нескольких узлах. Каждый узел - это отдельный сервер, состоящий из пространств ключей. Основным строительным блоком базы данных Cassandra являетсяkeyspace которую можно считать аналогом базы данных.

Данные в одном узле Cassandra реплицируются в других узлах по одноранговой сети узлов. Это делает Cassandra надежной базой данных. Сеть называется дата-центром. Несколько центров обработки данных могут быть соединены между собой в кластер. Характер репликации настраивается путем установки стратегии репликации и коэффициента репликации во время создания пространства ключей.

В одном пространстве ключей может быть несколько семейств столбцов - точно так же, как одна база данных может содержать несколько таблиц. В пространстве ключей Кассандры нет предопределенной схемы. Возможно, что каждая строка в таблице Cassandra может иметь столбцы с разными именами и номерами переменных.

Программное обеспечение Cassandra также доступно в двух версиях: для сообщества и для предприятий. Последняя корпоративная версия Cassandra доступна для загрузки по адресуhttps://cassandra.apache.org/download/. Версия сообщества находится по адресуhttps://academy.datastax.com/planet-cassandra/cassandra.

У Кассандры есть собственный язык запросов, который называется Cassandra Query Language (CQL). Запросы CQL могут выполняться из оболочки CQLASH - аналогично оболочке MySQL или SQLite. Синтаксис CQL похож на стандартный SQL.

Версия сообщества Datastax также поставляется с IDE Develcenter, показанной на следующем рисунке -

Модуль Python для работы с базой данных Cassandra называется Cassandra Driver. Он также разработан Apache Foundation. Этот модуль содержит ORM API, а также базовый API, аналогичный DB-API для реляционных баз данных.

Установка драйвера Cassandra легко выполняется с помощью pip utility.

pip3 install cassandra-driver

Взаимодействие с базой данных Cassandra осуществляется через объект Cluster. Модуль Cassandra.cluster определяет класс Cluster. Сначала нам нужно объявить объект Cluster.

from cassandra.cluster import Cluster
clstr=Cluster()

Все транзакции, такие как вставка / обновление и т. Д., Выполняются путем запуска сеанса с пространством ключей.

session=clstr.connect()

Чтобы создать новое пространство ключей, используйте execute()метод объекта сеанса. Метод execute () принимает строковый аргумент, который должен быть строкой запроса. В CQL есть инструкция CREATE KEYSPACE, как показано ниже. Полный код приведен ниже -

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

Вот, SimpleStrategy это ценность для replication strategy и replication factorустановлено в 3. Как упоминалось ранее, пространство ключей содержит одну или несколько таблиц. Каждая таблица характеризуется своим типом данных. Типы данных Python автоматически анализируются с соответствующими типами данных CQL в соответствии со следующей таблицей:

Тип Python Тип CQL
Никто НОЛЬ
Bool Булево
Плавать поплавок, двойной
int, long int, bigint, varint, smallint, tinyint, счетчик
десятичный. десятичный Десятичный
str, Юникод ascii, varchar, текст
буфер, массив байтов Blob
Свидание Свидание
Дата и время Отметка времени
Время Время
список, кортеж, генератор Список
набор, морозильник Набор
dict, OrderedDict карта
uuid.UUID timeuuid, uuid

Чтобы создать таблицу, используйте объект сеанса для выполнения запроса CQL для создания таблицы.

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)

Созданное таким образом пространство ключей можно в дальнейшем использовать для вставки строк. CQL-версия запроса INSERT аналогична инструкции SQL Insert. Следующий код вставляет строку в таблицу студентов.

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

Как и следовало ожидать, оператор SELECT также используется с Cassandra. В случае метода execute (), содержащего строку запроса SELECT, он возвращает объект набора результатов, который можно пройти с помощью цикла.

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

Запрос SELECT Cassandra поддерживает использование предложения WHERE для применения фильтра к выбираемому набору результатов. Распознаются традиционные логические операторы, такие как <,> == и т. Д. Чтобы получить только те строки из таблицы студентов для имен с возрастом> 20, строка запроса в методе execute () должна быть следующей:

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

Обратите внимание, использование ALLOW FILTERING. Часть ALLOW FILTERING этого оператора позволяет явно разрешить (некоторые) запросы, требующие фильтрации.

API драйвера Cassandra определяет следующие классы типа Statement в своем модуле cassendra.query.

SimpleStatement

Простой неподготовленный CQL-запрос, содержащийся в строке запроса. Все приведенные выше примеры являются примерами SimpleStatement.

BatchStatement

Несколько запросов (таких как INSERT, UPDATE и DELETE) помещаются в пакет и выполняются одновременно. Каждая строка сначала преобразуется как SimpleStatement, а затем добавляется в пакете.

Давайте поместим строки для добавления в таблицу студентов в виде списка кортежей следующим образом:

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

Чтобы добавить строки выше с помощью BathStatement, запустите следующий скрипт -

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)

Подготовленное заявление

Подготовленный оператор похож на параметризованный запрос в DB-API. Его строка запроса сохраняется Cassandra для дальнейшего использования. Метод Session.prepare () возвращает экземпляр PreparedStatement.

Для нашей таблицы студентов PreparedStatement для запроса INSERT выглядит следующим образом:

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

Впоследствии ему нужно только отправить значения параметров для привязки. Например -

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

Наконец, выполните связанный оператор выше.

session.execute(qry)

Это снижает сетевой трафик и использование ЦП, поскольку Cassandra не нужно каждый раз повторно анализировать запрос.