python数据库(一)

1.使用dbm作为持久化字典

#!/usr/bin/python
#coding:utf-8
'''用持久字典来存储名称/值对
数据是在磁盘读取和写入的
dbm的键和值必须是字符串类型'''

#三个实体items(物品信息)、members(成员信息)、loans(租借信息) 
#创建一个LendyDB DBM数据库(三个DBM文件)
import dbm

# ID, Name, Description, OwnerID, Price, Condition, DateRegistered
items = [
        ['1','Lawnmower','Tool','1','$150','Excellent','2012-01-05'],
        ['2','Lawnmower','Tool','2','$370','Fair','2012-04-01'],
        ['3','Bike','Vehicle','3','$200','Good','2013-03-22'],
        ['4','Drill','Tool','4','$100','Good','2013-10-28'],
        ['5','Scarifier','Tool','5','$200','Average','2013-09-14'],
        ['6','Sprinkler','Tool','1','$80','Good','2014-01-06'] 
        ]

# ID, Name, Email
members = [
        ['1', 'Fred', 'fred@lendylib.org'],
        ['2', 'Mike', 'mike@gmail.com'],
        ['3', 'Joe', 'joe@joesmail.com'],
        ['4', 'Rob', 'rjb@somcorp.com'],
        ['5', 'Anne', 'annie@bigbiz.com'],
        ]

# ID, ItemID(对应items ID), BorrowerID(对应members ID), DateBorrowed, DateReturned
loans = [
        ['1','1','3','4/1/2012','4/26/2012'],
        ['2','2','5','9/5/2012','1/5/2013'],
        ['3','3','4','7/3/2013','7/22/2013'],
        ['4','4','1','11/19/2013','11/29/2013'],
        ['5','5','2','12/5/2013','None']
        ]

def createDB(data,dbName):
    try:
        db = dbm.open(dbName,'c')
        for datum in data:
            key = datum[0]
            db[key] = ','.join(datum)      #使用第一个字段(ID)作为主键且所有字段用','分割
        #   print(key)             #打印键
        #   print(db[datum[0]])         #打印值
    finally:
        db.close()
        print(dbName,'created')

def readDB(dbName):
    try:
        db = dbm.open(dbName,'r')
        print('Reading ',dbName)
        return [db[key] for key in db.keys()]#通过键,返回一个数据列表
    finally:
        db.close()

def main1():
    print('Creating data files...')
    createDB(items,'itemdb')
    createDB(members,'memberdb')
    createDB(loans,'loandb')

    print('Reding data files...')
    print(readDB('itemdb'))
    print(readDB('memberdb'))
    print(readDB('loandb'))

def main2():
    items = dbm.open('itemdb')
    members = dbm.open('memberdb')
    loans = dbm.open('loandb','w')
    
    loan2 = loans['2'].decode()   #decode()把dbm字节格式转换成str字符串格式
    print('loan2:',loan2)
    loan2 = loan2.split(',')      #split()将str字符串分离成单独的域,返回一个列表 
    print('loan2:',loan2)

    #通过使用借出记录值作为键,提取对应的成员和物品记录#
    item2 = items[loan2[1]].decode().split(',')
    print('items:',item2)
    member2 = members[loan2[2]].decode().split(',')
    print('members:',member2)
    print('{} borrowed a {} on {}'.format(
        member2[1],item2[1],loan2[3]))
    
if __name__ == '__main__':
    main1()
    main2()
2.使用shelve作为持久化字典

#/usr/bin/python3
#coding:utf-8

import shelve

# ID, Name, Description, OwnerID, Price, Condition, DateRegistered
items = [
['1','Lawnmower','Tool','1','$150','Excellent','2012-01-05'],
['2','Lawnmower','Tool','2','$370','Fair','2012-04-01'],
['3','Bike','Vehicle','3','$200','Good','2013-03-22'],
['4','Drill','Tool','4','$100','Good','2013-10-28'],
['5','Scarifier','Tool','5','$200','Average','2013-09-14'],
['6','Sprinkler','Tool','1','$80','Good','2014-01-06'] 
]

# ID, Name, Email
members = [
['1', 'Fred', 'fred@lendylib.org'],
['2', 'Mike', 'mike@gmail.com'],
['3', 'Joe', 'joe@joesmail.com'],
['4', 'Rob', 'rjb@somcorp.com'],
['5', 'Anne', 'annie@bigbiz.com'],
]

# ID, ItemID, BorrowerID, DateBorrowed, DateReturned
loans = [
['1','1','3','4/1/2012','4/26/2012'],
['2','2','5','9/5/2012','1/5/2013'],
['3','3','4','7/3/2013','7/22/2013'],
['4','4','1','11/19/2013','11/29/2013'],
['5','5','2','12/5/2013','None']
]

def createDB(data, shelfname):
    try:
       shelf = shelve.open(shelfname,'c')
       for datum in data:
           key = datum[0]
           shelf[key] = datum
    finally:
       shelf.close()

def readDB(shelfname):
    try:
       shelf = shelve.open(shelfname,'r')
       return [shelf[key] for key in shelf.keys()]
    finally:
       shelf.close()

def main1():
    print('Creating data files...')
    createDB(items, 'itemshelf')
    createDB(members, 'membershelf')
    createDB(loans, 'loanshelf')

    print('reading items...')
    print(readDB('itemshelf'))
    print('reading members...')
    print(readDB('membershelf'))
    print('reading loans...')
    print(readDB('loanshelf'))

def main2():
    items = shelve.open('itemshelf','w')
    members = shelve.open('membershelf','w')
    loans = shelve.open('loanshelf','w')
    
    #与dbn区别:不再需要使用decode()把字节转换成普通字符串,不需要进行split()操作获得一个列表
    loan2 = loans['2']
    print('loan2:',loan2)
    item2 = items[loan2[1]]
    print('item2:',item2)
    member2 = members[loan2[2]]
    print('member2:',member2)

    print('{} borrowed a {} on {}'.format(
        member2[1],item2[1],loan2[3]))

if __name__ == "__main__": 
    main1()
    main2()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值