Python安装与使用ZODB,关系数据库并不是Python程序员唯一可用的解决方案,通常对象数据库可能更适合解决某些问题。ZODB是一个可扩展和冗余的对象数据库,其专注于存储可扩展的对象,而没有天生“对象—关系”不匹配情况:当尝试在面向对象的语言与关系查询系统的映射对象之间建立关系时,可能会出现这种情况。本文将详细讲解在Python程序中使用ZODB的基本知识。
安装并使用ZODB
在实际应用中,使用如下命令安装ZODB。
pip install ZODB
1.准备使用ZODB
下面的实例文件myzodb.py演示了创建ZODB对象的过程。
#-*-coding: UTF-8 -*-
from ZODB import FileStorage, DB
import transaction
class MyZODB(object):
def __init__ (self, path):
self.storage = FileStorage.FileStorage(path)
self.db = DB(self.storage)
self.connection = self.db.open()
self.dbroot = self.connection.root()
def close(self):
self.connection.close()
self.db.close()
self.storage.close()
在上述代码中,通过函数init()实现和指定ZODB数据库的连接,通过函数close()关闭当前数据库的连接。
2.存储简单Python数据
ZODB数据库可以存储所有类型的Python对象。下面的实例文件ZODB01.py演示了创建一个指定ZODB数据库的过程。
from myzodb import MyZODB, transaction
db = MyZODB('./Data.fs')
dbroot = db.dbroot
dbroot['a_number'] = 3
dbroot['a_string'] = 'Gift'
dbroot['a_list'] = [1, 2, 3, 5, 7, 12]
dbroot['a_dictionary'] = { 1918: 'Red Sox', 1919: 'Reds' }
dbroot['deeply_nested'] = {
1918: [ ('Red Sox', 4), ('Cubs', 2) ],
1919: [ ('Reds', 5), ('White Sox', 3) ],
}
transaction.commit()
db.close()
运行后会创建一个名为“Data.fs”的数据库,并向里面添加了指定的数据。
3.获取数据库中的数据
下面的实例文件ZODB02.py演示了获取指定ZODB数据库“Data.fs”中数据的过程。
from myzodb import MyZODB
db = MyZODB('./Data.fs')
dbroot = db.dbroot
for key in dbroot.keys():
print(key + ':', dbroot[key])
db.close()
执行后会输出:
4.更改数据
当将某个键设置为新值时,ZODB始终能够了解这一点。因此,对上面的数据库进行如下更改时将会自动识别和持久化。
db = MyZODB('./Data.fs')
dbroot = db.dbroot
dbroot['a_string'] = 'Something Else'
transaction.commit()
db.close()
但是需要显式地将对列表或字典的更改告诉ZODB,因为ZODB无法了解所做的更改。例如,下面的代码不会导致ZODB看到更改。
a_dictionary = dbroot['a_dictionary']
a_dictionary[1920] = 'Indians'
transaction.commit()
db.close()
如果打算更改而不是完全替换,则需要设置数据库根的属性 _p_changed,以通知它需要重新存储其下的属性,例如,下面的演示代码。
a_dictionary = dbroot['a_dictionary']
a_dictionary[1920] = 'Indians'
db._p_changed = 1
transaction.commit()
db.close()
5.删除数据
删除ZODB数据库中数据的方法十分简单,通过del语句即可实现,例如,下面的演示代码。
del dbroot['a_number']
transaction.commit()
db.close()
模拟银行存取款系统
下面的实例演示了使用ZODB数据库模拟在银行存款并取款的过程。
(1)编写实例文件customer.py,定义一个继承于Persistent的Account类。具体实现代码如下。
import persistent
class OutOfFunds(Exception):
pass
class Account(persistent.Persistent):
def __init__(self,name,start_balance=0):
self.name = name
self.balance = start_balance
def __str__(self):
return "Account: %s, balance: %s" %(self.name,self.balance)
def __repr__(self):
return "Account: %s, balance: %s" %(self.name,self.balance)
def deposit(self,amount):
"""save amount into balance"""
self.balance += amount
def withdraw(self,amount):
"""withdraw from balance"""
if amount > self.balance:
raise OutOfFunds
self.balance -= amount
return self.balance
(2)编写实例文件zodb_customer_app.py模拟银行的存款和取款。具体实现代码如下。
import ZODB
import ZODB.FileStorage as ZFS
import transaction
import customer
class ZODBUtils:
conn = None
filestorage = None
def openConnection(self,file_name):
self.filestorage = ZFS.FileStorage(file_name)
db = ZODB.DB(self.filestorage)
self.conn = db.open()
return self.conn
def closeConnection(self):
self.conn.close()
self.filestorage.close()
def init_balance():
zodbutils = ZODBUtils()
conn = zodbutils.openConnection('zodb_filestorage.db')
root = conn.root()
noah = customer.Account('noah',1000)
print(noah)
root['noah'] = noah
jermy = customer.Account('jermy',2000)
print(jermy)
root['jermy'] = jermy
transaction.commit()
zodbutils.closeConnection()
def app():
zodbutils = ZODBUtils()
conn = zodbutils.openConnection('zodb_filestorage.db')
root = conn.root()
noah = root['noah']
print("Before Deposit Or Withdraw")
print("=" * 30)
print(noah)
jermy = root['jermy']
print(jermy)
print('-' * 30)
transaction.begin()
noah.deposit(300)
jermy.withdraw(300)
transaction.commit()
print("After Deposit Or Withdraw")
print("=" * 30)
print(noah)
print(jermy)
print("-" * 30)
zodbutils.closeConnection()
if __name__ == '__main__':
init_balance()
app()
执行后会输出:
Account: noah, balance: 1000
Account: jermy, balance: 2000
Before Deposit Or Withdraw
==============================
Account: noah, balance: 1000
Account: jermy, balance: 2000
------------------------------
After Deposit Or Withdraw
==============================
Account: noah, balance: 1300
Account: jermy, balance: 1700
------------------------------
酷客网相关文章:
评论前必须登录!
注册