Python 操作Cassandra
Cassandra 协议
Cassandra 支持两种协议。 传统的thrift 协议和更强大的native 协议。 默认地它们分别侦听9160 端口和9042 端口。 要使用native 协议,需要设置
start_native_transport: true
native_transport_port: 9042
Python 有2个模块, pycassa 和 python-driver。 前者仅仅支持thrift 协议, 后者仅仅支持native 协议。 选择正确的模块是能够正常工作的第一步。
另外,如果想通过pycassa 去访问由CQL3 创建的表, CQL3 创建的时候必须指定WITH COMPACT STORAGE 选项
CREATE TABLE clicks (
key text,
column1 timestamp,
value text,
PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE;
另外,pycassa 已经很少更新了,只有在native 协议被disable 的时候才会被用到。 刚检查了一下github, pycassa 最后一次更新是2014/8/9, python-driver 的最后更新是2个小时前。
参考文档:
- http://www.meetup.com/Austin-Cassandra-Users/events/147573572/
- http://www.datastax.com/dev/blog/thrift-to-cql3
- http://stackoverflow.com/questions/14185291/reading-cassandra-1-2-table-with-pycassa
pycassa
ColumnFamily 基本操作
>>> from pycassa.pool import ConnectionPool
>>> from pycassa.columnfamily import ColumnFamily
>>> pool = ConnectionPool('test', ['10.43.100.19:9160'])
>>> cf = ColumnFamily(pool, 'user_profiles')
>>> cf.insert(1, {'fname': 'f1', 'lname': 'l1'}) # 注意单行插入 row key 和 column data 之间用,
>>> cf.insert(2, {'fname': 'f2', 'lname': 'l2'})
>>> cf.batch_insert({3: {'fname': 'f3', 'lname': 'l3'}, 4: {'fname': 'f4', 'lname': 'l4'}}) # 注意多行插入 row key 和 column data 之间用:, 不同行之间用,
>>> cf.get(1)
>>> cf.get(1, columns=['fname'])
>>> cf.get('row_key', column_start='5', column_finish='7')
>>> cf.get('row_key', column_reversed=True, column_count=3)
>>> cf.multiget(['row1', 'row2'])
>>> for i in cf.get_range():
>>> for i in cf.get_range(start='row_key5', finish='row_key7')
>>> cf.get_count('foo') # cf里面foo 这一行总共有多少列
>>> cf.get_count('row_key', columns=['foo', 'bar']) # 只去寻找'for', 'bar' 的这2列
SystemManager
SystemManager 主要用于执行System 级别的一些命令,如keyspace/column family 的创建修改删除工作, 获得Cluster 级别的信息。