Python 資料持久化 - Cassandra 驅動程式



Cassandra 是另一個流行的 NoSQL 資料庫。高可擴充套件性、一致性和容錯性——這些是 Cassandra 的一些重要特性。這是一個列儲存資料庫。資料儲存在許多商品伺服器上。因此,資料高度可用。

Cassandra 是 Apache 軟體基金會的產品。資料以分散式方式儲存在多個節點上。每個節點都是由鍵空間組成的單個伺服器。Cassandra 資料庫的基本構建塊是鍵空間,可以將其視為類似於資料庫。

Cassandra 一個節點中的資料會在節點的點對點網路中的其他節點上進行復制。這使得 Cassandra 成為一個萬無一失的資料庫。該網路稱為資料中心。多個數據中心可以互連以形成叢集。複製的性質是在建立鍵空間時透過設定複製策略和複製因子來配置的。

一個鍵空間可以擁有多個列族——就像一個數據庫可以包含多個表一樣。Cassandra 的鍵空間沒有預定義的模式。Cassandra 表中的每一行可能包含名稱不同且數量可變的列。

Cassandra Table

Cassandra 軟體也有兩個版本:社群版和企業版。Cassandra 的最新企業版可從https://cassandra.apache.org/download/下載。

Cassandra 有自己的查詢語言,稱為Cassandra 查詢語言 (CQL)。CQL 查詢可以從 CQLASH shell 內部執行——類似於 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 型別 CQL 型別
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 語句。以下程式碼在 students 表中插入一行。

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。對於包含 SELECT 查詢字串的 execute() 方法,它會返回一個結果集物件,可以使用迴圈遍歷該物件。

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 型別的類。

SimpleStatement

一個簡單的、未準備好的 CQL 查詢,包含在查詢字串中。以上所有示例都是 SimpleStatement 的示例。

BatchStatement

多個查詢(例如 INSERT、UPDATE 和 DELETE)被放入批處理中並一次執行。每一行首先被轉換為 SimpleStatement,然後新增到批處理中。

讓我們將要新增到 Students 表中的行以元組列表的形式放入,如下所示:

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

Prepared statement 類似於 DB-API 中的引數化查詢。它的查詢字串由 Cassandra 儲存以供以後使用。Session.prepare() 方法返回一個 PreparedStatement 例項。

對於我們的 students 表,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 不必每次都重新解析查詢。

廣告