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()
相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
409 7
|
2月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
237 3
|
2月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
489 3
|
2月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
314 3
|
3月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
328 0
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
171 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
851 152
|
3月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。

推荐镜像

更多