Python-data-persistence-cassandra-driver

提供:Dev Guides
移動先:案内検索

Pythonデータの永続性-Cassandraドライバー

Cassandraは、もう1つの人気のあるNoSQLデータベースです。 高いスケーラビリティ、一貫性、フォールトトレランス-これらは、Cassandraの重要な機能の一部です。 これは*列ストア*データベースです。 データは多くのコモディティサーバーに保存されます。 その結果、データの可用性が高くなります。

Cassandraは、Apache Software Foundationの製品です。 データは複数のノードに分散して保存されます。 各ノードは、キースペースで構成される単一のサーバーです。 Cassandraデータベースの基本的な構成要素は keyspace であり、データベースに類似していると考えることができます。

Cassandraの1つのノードのデータは、ノードのピアツーピアネットワークを介して他のノードに複製されます。 そのため、Cassandraは間違いのないデータベースになります。 ネットワークはデータセンターと呼ばれます。 複数のデータセンターを相互接続してクラスターを形成できます。 レプリケーションの性質は、キースペースの作成時にレプリケーション戦略とレプリケーション係数を設定することによって構成されます。

1つのデータベースに複数のテーブルが含まれているのと同じように、1つのキースペースに複数の列ファミリーがある場合があります。 Cassandraのキースペースには、事前定義されたスキーマがありません。 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も付属しています-

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使用率が削減されます。