• python模块之bsddb: bdb高性能嵌入式数据库 1.基础知识


    http://blog.csdn.net/zhaoweikid/article/details/1665741

        bsddb模块是用来操作bdb的模块,bdb是著名的Berkeley DB,它的性能非常好,mysql的存储后端引擎都支持bdb的方式。这里简单介绍一些关于bsddb的使用方法。

        bdb不同于一般的关系数据库,它存储的数据只能是以key和value组成的一对数据,使用就像python的字典一样,它不能直接表示多个字段,当要存储多个字段的数据时,只能把数据作为一个整体存放到value中。
    使用bsddb面临的第一问题是使用什么数据访问方法,bdb支持四种:btree, hash, queue, recno。这里先说说它们有什么区别,btree是用的树结构来才存储的数据,查询速度很快,可以存储任意复杂的key和value。hash是用的hash算法,速度其实和btree比差不多的,但是当数据量特别巨大时,应该使用hash。queue是队列操作,它有一个限制,它只能存储定长的数据,也就是说value的长度是固定的!但是queue可以保持数据的先进先出,并且对数据的插入做了特殊的优化,并且提供行级锁。queue的key必须是数字。recno和queue类似,但是它可以支持变长的value,它的key同样也是数字。

        这里先对这四种数据访问方法分别做打开数据库,简单插入一条数据的演示。
    对于python的bsddb模块来说,打开数据库的操作有两种方式,一是使用原始的接口,就是先打开一个环境,然后从这个环境中打开一个数据库,就像下面:

    import bsddb

    dbenv = bsddb.db.DBEnv()
    dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
    d = bsddb.db.DB(dbenv)
    d.open(filename, bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, 0666)



    还有一种方式是python特有的,这个是bsddb模块本身对上面的过程做了包装,比如打开btree的:

    import bsddb

    db = bsddb.btopen('test.db', 'c')



    看起来比上面的简单多了吧。但这种方式提供的接口很有限,也只有很简单的功能,没有第一种的灵活,但是它在python2.5的版本里是线程安全的。这里都介绍一下。
    看看一个例子:
     

    #-*- encoding: gb2312 -*-
    import os, sys, string
    import bsddb, time

    home = "db_home"
    filename = "test.db"
    try:
        # 创建home目录
        os.mkdir(home)
    except:
        pass

    # 创建数据库环境
    dbenv = bsddb.db.DBEnv()
    # 打开数据库环境
    dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
    # 创建数据库对象
    d = bsddb.db.DB(dbenv)
    # 打开数据库, 这里的第二个参数就是指定使用什么数据访问方法
    # btree是 bsddb.db.DB_BTREE, hash是bsddb.db.DB_HASH
    # queu 是 bsddb.db.DB_QUEUE,  recno 是bsddb.db.DB_RECNO
    d.open(filename, bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, 0666)
    # 插入一条数据,注意queue和recno的key不能是字符串的,应该是数字
    d.put('test1', 'zhaowei')    
    print d.items()
    # 关闭,这时会把数据写回文件
    d.close()
    dbenv.close()


    下面来个使用queue的,注意看有什么区别:

    #-*- encoding: gb2312 -*-
    import os, sys, string
    import bsddb, time

    home = "db_home"
    filename = "testqueue.db"
    try:
        os.mkdir(home)
    except:
        pass

    dbenv = bsddb.db.DBEnv()
    dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
    d = bsddb.db.DB(dbenv)
    # queue必须要设置一个value的长度,它的value是定长的
    d.set_re_len(40)
    d.open(filename, bsddb.db.DB_QUEUE, bsddb.db.DB_CREATE, 0666)
    # 它的key必须是数字
    d.put(1, 'zhaowei')
    print d.items()

    d.close()
    dbenv.close()


    那简单的第二种方式使用如下, 要简洁很多了:

    import bsddb

    d = bsddb.hashopen("aaa.db", "c")
    d['test1'] = "zhaowei"
    print d.items()
    d.close()
  • 相关阅读:
    Android开发环境配置
    还原数据库的时候显示“因为数据库正在使用,所以无法获得对数据库的独占访问权”
    Sql中当插入的字符多于8000个字符只能插入一部分,数据丢失的处理
    XML序列化的注意事项
    Js中的this和window.event.srcElement
    JS中的加密解密操作,以及对应的C#中的加密解密
    添加WebService
    CSRF(跨站点请求伪造)
    css中table-layout:fixed 属性的解说
    vs2012发布网站到IIS遇到的问题
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/6679480.html
Copyright © 2020-2023  润新知