Python数据持久性 Cassandra驱动
Cassandra是另一个流行的NoSQL数据库。高可扩展性、一致性和容错性–这些是Cassandra的一些重要特征。这是一个 柱状存储 数据库。数据被存储在许多商品服务器上。因此,数据高度可用。
Cassandra是Apache软件基金会的一个产品。数据以分布式方式存储在多个节点上。每个节点都是一个由钥匙空间组成的单一服务器。卡桑德拉数据库的基本构件是 钥匙空间 ,它可以被视为类似于数据库。
Cassandra一个节点上的数据,通过一个点对点的节点网络复制到其他节点。这使得Cassandra成为一个万无一失的数据库。这个网络被称为数据中心。多个数据中心可以相互连接,形成一个集群。复制的性质是在创建密钥空间时通过设置复制策略和复制因子来配置的。
一个钥匙空间可以有多个列族–就像一个数据库可以包含多个表一样。Cassandra的keyspace没有预定义的模式。Cassandra表中的每一行都有可能有不同名称的列,而且数量不定。
Cassandra软件也有两个版本:社区和企业。最新的Cassandra企业版可在https://cassandra.apache.org/download/。 社区版可在https://academy.datastax.com/planet-cassandra/cassandra 上找到。
Cassandra有自己的查询语言,称为 Cassandra查询语言(CQL)。 CQL查询可以从CQLASH外壳内执行–类似于MySQL或SQLite外壳。CQL的语法看起来与标准SQL相似。
Datastax社区版还配备了一个开发中心集成开发环境,如下图所示。
用于处理Cassandra数据库的Python模块被称为 Cassandra驱动。 它也是由Apache基金会开发的。该模块包含一个ORM API,以及一个与关系型数据库的DB-API性质相似的核心API。
Cassandra驱动的安装可以通过 pip工具 轻松完成 。
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类型 | CQL类型 |
---|---|
无 | NULL |
Bool | 布尔型 |
浮点数 | float, double |
int, long | int, bigint, varint, smallint, tinyint, counter |
十进制.十进制 | 十进制 |
str, Unicode | ascii, varchar, text |
buffer, bytearray | Blob |
日期 | 日期 |
日期时间 | 时间戳 |
时间 | 时间 |
列表、元组、生成器 | 列表 |
集合,frozenset | 集合 |
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插入语句相似。下面的代码在学生表中插入了一行。
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子句来对要获取的结果集进行过滤。传统的逻辑运算符如<, > ==等都被认可。为了从学生表中只检索年龄大于20岁的那些记录,execute()方法中的查询字符串应该是这样的
rows=session.execute("select * from students WHERE age>20 allow filtering;")
注意,使用 ALLOW FILTERING 。 该语句的ALLOW FILTERING部分允许明确地允许需要过滤的(某些)查询。
Cassandra驱动API在其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)
预备语句(PreparedStatement)
预备语句就像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])
最后,执行上面的绑定语句。
session.execute(qry)
这减少了网络流量和CPU利用率,因为Cassandra不必每次都重新解析查询。