Python-data-persistence-cassandra-driver
Pythonデータの永続性-Cassandraドライバー
Cassandraは、もう1つの人気のあるNoSQLデータベースです。 高いスケーラビリティ、一貫性、フォールトトレランス-これらは、Cassandraの重要な機能の一部です。 これは*列ストア*データベースです。 データは多くのコモディティサーバーに保存されます。 その結果、データの可用性が高くなります。
Cassandraは、Apache Software Foundationの製品です。 データは複数のノードに分散して保存されます。 各ノードは、キースペースで構成される単一のサーバーです。 Cassandraデータベースの基本的な構成要素は keyspace であり、データベースに類似していると考えることができます。
Cassandraの1つのノードのデータは、ノードのピアツーピアネットワークを介して他のノードに複製されます。 そのため、Cassandraは間違いのないデータベースになります。 ネットワークはデータセンターと呼ばれます。 複数のデータセンターを相互接続してクラスターを形成できます。 レプリケーションの性質は、キースペースの作成時にレプリケーション戦略とレプリケーション係数を設定することによって構成されます。
1つのデータベースに複数のテーブルが含まれているのと同じように、1つのキースペースに複数の列ファミリーがある場合があります。 Cassandraのキースペースには、事前定義されたスキーマがありません。 Cassandraテーブルの各行に、異なる名前と変数番号の列が含まれている可能性があります。
Cassandraソフトウェアには、コミュニティとエンタープライズの2つのバージョンもあります。 Cassandraの最新のエンタープライズバージョンは、https://cassandra.apache.org/download/からダウンロードできます。 コミュニティエディションはhttps://academy.datastax.com/planet-cassandra/cassandraにあります。
Cassandraには、* Cassandra Query Language(CQL)*と呼ばれる独自のクエリ言語があります。 CQLクエリは、MySQLやSQLiteシェルと同様に、CQLASHシェル内から実行できます。 CQL構文は、標準SQLに似ています。
Datastaxコミュニティエディションには、次の図に示すDevelcenter IDEも付属しています-
Cassandraデータベースを操作するためのPythonモジュールは Cassandra Driver と呼ばれます。 また、Apache Foundationによって開発されています。 このモジュールには、ORM APIと、リレーショナルデータベースのDB-APIに本質的に類似したコアAPIが含まれています。
Cassandraドライバーのインストールは、* pipユーティリティ*を使用して簡単に実行できます。
pip3 install cassandra-driver
Cassandraデータベースとの対話は、クラスターオブジェクトを介して行われます。 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に設定されています。 前述のように、キースペースには1つ以上のテーブルが含まれています。 各テーブルは、データ型によって特徴付けられます。 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挿入ステートメントに似ています。 次のコードは、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句の使用をサポートしています。 <、> ==などの従来の論理演算子 認識されます。 age> 20の名前のstudentsテーブルからそれらの行のみを取得するには、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として変換され、次にバッチで追加されます。
次のように、タプルのリストの形式でStudentテーブルに追加する行を入れましょう-
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)
Cassandraは毎回クエリを再解析する必要がないため、これによりネットワークトラフィックとCPU使用率が削減されます。