📜  Python数据持久性-Cassandra驱动程序

📅  最后修改于: 2020-11-07 08:29:01             🧑  作者: Mango


Cassandra是另一个流行的NoSQL数据库。高可伸缩性,一致性和容错能力-这些是Cassandra的一些重要功能。这是列存储数据库。数据存储在许多商品服务器上。结果,数据高度可用。

Cassandra是Apache Software基金会的产品。数据跨多个节点以分布式方式存储。每个节点都是由键空间组成的单个服务器。 Cassandra数据库的基本构建块是密钥空间,可以认为它类似于数据库。

Cassandra的一个节点中的数据通过节点的对等网络复制到其他节点中。这使Cassandra成为了一个万无一失的数据库。该网络称为数据中心。多个数据中心可以互连以形成集群。复制的性质是通过在创建键空间时设置复制策略和复制因子来配置的。

一个键空间可能具有多个列族-就像一个数据库可能包含多个表一样。 Cassandra的键空间没有预定义的架构。 Cassandra表中的每一行都可能具有名称不同且编号可变的列。

卡桑德拉表

Cassandra软件也有两个版本:社区版和企业版。可从https://cassandra.apache.org/download/下载最新版本的Cassandra。社区版本位于https://academy.datastax.com/planet-cassandra/cassandra中

Cassandra有自己的查询语言,称为Cassandra查询语言(CQL) 。可以从CQLASH shell内执行CQL查询–与MySQL或SQLite shell相似。 CQL语法看起来类似于标准SQL。

Datastax社区版还带有Develcenter IDE,如下图所示-

Develcenter IDE

用于Cassandra数据库的Python模块称为Cassandra驱动程序。它也是由Apache基金会开发的。该模块包含一个ORM API以及一个本质上类似于关系数据库的DB-API的核心API。

使用pip实用程序可以轻松完成Cassandra驱动程序的安装。

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复制策略的值,复制因子设置为3。如前所述,一个键空间包含一个或多个表。每个表均以其数据类型为特征。 Python数据类型将根据下表自动解析为相应的CQL数据类型-

Python Type CQL Type
None NULL
Bool Boolean
Float float, double
int, long int, bigint, varint, smallint, tinyint, counter
decimal.Decimal Decimal
str, Unicode ascii, varchar, text
buffer, bytearray Blob
Date Date
Datetime Timestamp
Time Time
list, tuple, generator List
set, frozenset Set
dict, OrderedDict Map
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)

这样创建的键空间可以进一步用于插入行。 INSERT查询的CQL版本类似于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]))

Cassandra的SELECT查询支持使用WHERE子句对要获取的结果集应用过滤器。可以识别传统的逻辑运算符,例如<,> ==等。要检索,仅来自students表中年龄大于20的名称的行,execute()方法中的查询字符串应如下所示-

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

注意,使用ALLOW FILTERING 。该语句的ALLOW FILTERING部分允许显式允许(某些)需要过滤的查询。

Cassandra驱动程序API在其cassendra.query模块中定义了以下Statement类型的类。

简单陈述

查询字符串包含的简单的,未经准备的CQL查询。上面的所有示例都是SimpleStatement的示例。

批处理声明

多个查询(例如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实例。

对于我们的学生表,INSERT查询的PreparedStatement如下-

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

随后,只需要发送参数值即可绑定。例如-

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

最后,执行上面的bound语句。

session.execute(qry)

因为Cassandra不必每次都重新解析查询,所以这减少了网络流量和CPU利用率。