Skynet

          ---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks

          在實際中也可以 由文件導入 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 為奇數(shù)行,value 為 偶數(shù)行


          下面轉(zhuǎn),收集

             bsddb模塊是用來操作bdb的模塊,bdb是著名的Berkeley DB,它的性能非常好,mysql的存儲后端引擎都支持bdb的方式。這里簡單介紹一些關(guān)于bsddb的使用方法。

              bdb不同于一般的關(guān)系數(shù)據(jù)庫,它存儲的數(shù)據(jù)只能是以key和value組成的一對數(shù)據(jù),使用就像python的字典一樣,它不能直接表示多個字段,當要存儲多個字段的數(shù)據(jù)時,只能把數(shù)據(jù)作為一個整體存放到value中。
          使用bsddb面臨的第一問題是使用什么數(shù)據(jù)訪問方法,bdb支持四種:btree, hash, queue, recno。這里先說說它們有什么區(qū)別,btree是用的樹結(jié)構(gòu)來才存儲的數(shù)據(jù),查詢速度很快,可以存儲任意復雜的key和value。hash是用的hash算法,速度其實和btree比差不多的,但是當數(shù)據(jù)量特別巨大時,應該使用hash。queue是隊列操作,它有一個限制,它只能存儲定長的數(shù)據(jù),也就是說value的長度是固定的!但是queue可以保持數(shù)據(jù)的先進先出,并且對數(shù)據(jù)的插入做了特殊的優(yōu)化,并且提供行級鎖。queue的key必須是數(shù)字。recno和queue類似,但是它可以支持變長的value,它的key同樣也是數(shù)字。

              這里先對這四種數(shù)據(jù)訪問方法分別做打開數(shù)據(jù)庫,簡單插入一條數(shù)據(jù)的演示。
          對于python的bsddb模塊來說,打開數(shù)據(jù)庫的操作有兩種方式,一是使用原始的接口,就是先打開一個環(huán)境,然后從這個環(huán)境中打開一個數(shù)據(jù)庫,就像下面:

          import bsddb

          dbenv 
          = bsddb.db.DBEnv()
          dbenv.open(home, bsddb.db.DB_CREATE 
          | bsddb.db.DB_INIT_MPOOL)
          = 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:
              
          # 創(chuàng)建home目錄
              os.mkdir(home)
          except:
              
          pass

          # 創(chuàng)建數(shù)據(jù)庫環(huán)境
          dbenv = bsddb.db.DBEnv()
          # 打開數(shù)據(jù)庫環(huán)境
          dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
          # 創(chuàng)建數(shù)據(jù)庫對象
          = bsddb.db.DB(dbenv)
          # 打開數(shù)據(jù)庫, 這里的第二個參數(shù)就是指定使用什么數(shù)據(jù)訪問方法
          #
           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)
          # 插入一條數(shù)據(jù),注意queue和recno的key不能是字符串的,應該是數(shù)字
          d.put('test1''zhaowei')    
          print d.items()
          # 關(guān)閉,這時會把數(shù)據(jù)寫回文件
          d.close()
          dbenv.close()

          下面來個使用queue的,注意看有什么區(qū)別:

          #-*- 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)
          = bsddb.db.DB(dbenv)
          # queue必須要設(shè)置一個value的長度,它的value是定長的
          d.set_re_len(40)
          d.open(filename, bsddb.db.DB_QUEUE, bsddb.db.DB_CREATE, 
          0666)
          # 它的key必須是數(shù)字
          d.put(1'zhaowei')
          print d.items()

          d.close()
          dbenv.close()

          那簡單的第二種方式使用如下, 要簡潔很多了:

          import bsddb

          = bsddb.hashopen("aaa.db""c")
          d[
          'test1'= "zhaowei"
          print d.items()
          d.close()



          整理 www.aygfsteel.com/Good-Game
          posted on 2009-06-16 23:22 劉凱毅 閱讀(1389) 評論(0)  編輯  收藏 所屬分類: python
          主站蜘蛛池模板: 林州市| 梁河县| 泾川县| 台中市| 静安区| 金山区| 安吉县| 射洪县| 建始县| 廉江市| 巩义市| 古田县| 苏尼特右旗| 紫阳县| 建始县| 新密市| 乌什县| 慈溪市| 鄂托克旗| 洪雅县| 宁安市| 财经| 利辛县| 柯坪县| 南宫市| 新营市| 盖州市| 县级市| 保定市| 台州市| 尼木县| 萨嘎县| 广南县| 且末县| 彭阳县| 措勤县| 阳西县| 武宁县| 浦东新区| 奈曼旗| 吴桥县|