python bsddb (db-key 转)

简介:
在实际中也可以 由文件导入 db 库中 
    awk -F: '{print $1; print $0}' < /etc/passwd 显示为:
root
root:x:0:0:root:/root:/bin/bash
bin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm
adm:x:3:4:adm:/var/adm:/sbin/nologin
............
awk -F: '{print $1; print $0}' < /etc/passwd |sed 's/\\/\\\\/g'  | db_load -T -t hash passwd.db
hash 入库为  key 为奇数行,value 为 偶数行
下面转,收集
   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()

本文转自博客园刘凯毅的博客,原文链接:python bsddb (db-key 转),如需转载请自行联系原博主。


目录
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
Python DB-API
【8月更文挑战第22天】
38 11
|
测试技术 Python
Python内置函数--dir()&id()
Python内置函数--dir()&id()
53 0
|
数据库 Python
执行superset db upgrade初始化Supetset数据库时报错ImportError: cannot import name ‘soft_unicode’ from ‘markupsaf
执行superset db upgrade初始化Supetset数据库时报错ImportError: cannot import name ‘soft_unicode’ from ‘markupsaf
239 0
|
Python
Python|函数list和set
Python|函数list和set
102 0
|
编解码 关系型数据库 MySQL
python2.7传数据到数据库OperationalError: (1366, "Incorrect string value")
python2.7传数据到数据库OperationalError: (1366, "Incorrect string value")
128 0
|
SQL OLAP Python
Jupyter(Python)模糊查询Analytic DB数据的正确方法
Jupyter(Python)模糊查询Analytic DB数据的正确方法
2530 0
|
数据库 Python
|
SQL NoSQL 应用服务中间件