本文档主要介绍如何使用 Python 客户端驱动接口编写使用 SequoiaDB 巨杉数据库的程序。下述为 SequoiaDB 巨杉数据库 Python 驱动的简单示例,示例中的代码可能不完整,用户可在 /sequoiadb/samples/Python
目录下获取相应的完整代码。
Note:
在 Python 中构造 BSON 时默认使用 dict,dict 的字段是无序的。如果要求 BSON 中的字段顺序与输入顺序一致(例如,创建索引时索引键的定义),需要使用 collections.OrderedDict。
数据库连接
通过编写 connect.py
连接到数据库
from pysequoiadb import * host = 'localhost' port = 11810 host_list = [ {'host': 'sdbserver1', 'service': 11810}, { 'host': 'sdbserver2', 'service': 11810 } ] # 只使用一个地址连接 db = client( host, port ) db.disconnect() # 使用多个地址连接,从地址列表中随机选择地址进行连接,直至连接成功 db = client( host_list=host_list, policy='random' ) db.disconnect() # 如果数据库已经创建用户,需要使用正确的用户及密码才能连接到数据库 user = "sdbadmin" psw = "sdbadmin" db = client( host, port, user, psw ) db.disconnect() # 当然,也支持使用密码文件进行连接 cipher_file="/opt/sequoiadb/cipher" db = client( host, port, user, cipher_file=cipher_file ) db.disconnect()
Note:
用户可以根据实际情况调整上述配置参数,如用户名、密码等。
密码文件的使用,请参考密码管理工具
创建集合空间和集合
# 连接至数据库 db = client("localhost", 11810) # 创建集合空间 cs_name = 'sample' cs = db.create_collection_space(cs_name) # 创建集合 cl_name = 'employee' cl = cs.create_collection(cl_name)
用户创建集合后,可对集合做增删改查等操作
插入数据
# 创建 dict 对象 record = {"name":"Tom", "age":24} oid = cl.insert ( record )
record 为输入参数,输入需要插入的数据。dict 对象将会被转换成 bson 插入到集合中。oid 是插入该记录时,返回的 bson 结构的 objectid。
查询
查询操作需要一个游标对象存放查询的结果到本地。要获得查询的结果需要使用游标操作。本示例使用了游标操作的 next 接口,表示从查询结果中取到一条记录。
import pysequoiadb from pysequoiadb import client from pysequoiadb.error import SDBEndOfCursor cr = cl.query() while True: try: record = cr.next() print(record) except SDBEndOfCursor: break cr.close()
索引
集合对象 collection 中创建一个以“name”为升序、“age”为降序的索引
index_name = "index_name" idx = OrderedDict([('name', 1), ('age', -1)]) cl.create_index ( idx, index_name, False, False )
更新
在集合对象 collection 中更新了记录
rule = {"$set":{ "age":19}} print rule cl.update( rule )
示例中没有指定数据匹配规则,所以将更新集合中的所有记录。
错误处理
调用 API 遇到的异常时,python 驱动会将异常直接抛出。可以选择捕获异常,并打印异常信息或是进行一些其他操作。SDBBaseError 异常是基础异常,异常主要包含 errcode、detail 和 error_object。异常的详情可以查询 Python API。示例如下:
try: cl = db.get_collection("sample.employee") condition = {"_id":{"$oid":"5d035e2bb4d450b04fcd0dff"}} cl.delete ( condition=condition ) except SDBBaseError as e: print(e)
异常信息如下:
SDB_INVALIDARG(-6), Invalid Argument, detail: Failed to delete
复制组操作
复制组操作包括创建复制组(client::creat_replica_group)、得到复制组实例(client:: get_replica_group_by_name 和 client:: get_replica_group_by_id)、启动复制组所有节点(replicagroup::start)、停止复制组所有节点(replicagroup::stop)等。以下仅作为示例,真正的应用应包括错误检测等。
# 创建名为“group1”的数据组 rg = db.create_replica_group ("group1") # 创建节点时,定义一个空的 map 对象 config 表示该节点没有更多的配置内容 config = {} rg.create_node ('sdbserver', '11820', "/opt/sequoiadb/database/11820", config) # 启动复制组 rg.start ()
节点操作
节点操作包括创建节点(replicagroup::create_node)、获取主节点(replicagroup::get_master)、获取备节点(replicagroup::get_slave)、启动节点(replicanode::start)、停止节点(replicanode::stop)等。
以下为数据节点操作示例性的例子,真正的应用应包括错误检测等。
# 获取数据组 group1 rg = db.get_replica_group_by_name("group1") # 获取数据主节点 master = rg.get_master() # 获取数据备节点 slave = rg.get_slave()