python的对象数据库ZODB的使用(python3经典编程案例)

简介: 该文章介绍了如何使用Python的对象数据库ZODB来进行数据存储,包括ZODB的基本操作如创建数据库、存储和检索对象等,并提供了示例代码。

一. 概述

ZODB是一个可拓展和冗余的数据库,专注于存储可拓展的对象。

使用ZODB的好处:

  • 使对象持久化对代码几乎没有影响,代码和数据库之间几乎没有接缝。
  • 没有部分隐藏数据库的数据库映射程序。
  • 象之间的关系处理得非常自然,支持没有连接的复杂对象图。
  • 数据本地保存,不需要安装软件和搭建环境。

官方文档:http://www.zodb.org/en/latest/

安装:pip install ZODB

二. 基本使用

1. 存储数据

# -*-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()


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()

2. 获取数据

# -*-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()


db = MyZODB('./Data.fs')
dbroot = db.dbroot
for key in dbroot.keys():
    print(key + ':', dbroot[key])
db.close()

3. 更改数据

# -*-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()


db = MyZODB('./Data.fs')
dbroot = db.dbroot
# dbroot['a_string'] = 'Gift啊'
# transaction.commit()
# db.close()

# 更改字典数据时
a_dict = dbroot['a_dictionary']
a_dict[1920] = '1234567'
# 设置数据库的根属性,通知他需要重新存储其下的属性
dbroot._p_changed = 1
transaction.commit()
db.close()

4. 删除数据

# -*-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()


db = MyZODB('./Data.fs')
dbroot = db.dbroot
del dbroot['a_number']
transaction.commit()
db.close()

三. 综合案例:模拟银行存取款系统

# -*-coding: UTF-8 -*-
import ZODB
import ZODB.FileStorage as ZFS
import transaction


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 f"Account: {self.name}, balance: {self.balance}"

    def __repr__(self):
        return f"Account: {self.name}, balance: {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


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 = Account('noah', 1000)
    print(noah)
    root['noah'] = noah

    jermy = 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()
相关文章
|
9月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
1479 102
|
8月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
8月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
500 3
|
8月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
727 3
|
8月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
536 3
|
8月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
744 0
|
安全 测试技术 数据库
Python编程--sys模块及OS模块简单用例
Python编程--sys模块及OS模块简单用例
348 1
|
JSON 数据格式 Python
Python编程:利用JSON模块编程验证用户
Python编程:利用JSON模块编程验证用户
182 1
|
数据处理 Python
Python编程-利用datetime模块生成当前年份之前指定的间隔所有年份的日期列表和csv文件
Python编程-利用datetime模块生成当前年份之前指定的间隔所有年份的日期列表和csv文件
360 1
|
人工智能 安全 Java
Python 多线程编程实战:threading 模块的最佳实践
Python 多线程编程实战:threading 模块的最佳实践
594 5

热门文章

最新文章

推荐镜像

更多