作者:钱魏Way
来源:https://www.biaodianfu.com/python-databases.html
Python 作为一种高层次的编程语言,因其简单易用和强大的社区支持,被用于实现多种类型的数据库。这些数据库可以分为几大类,包括关系型数据库、NoSQL 数据库、嵌入式数据库和面向对象数据库等。下面这些数据库不常用,看可以通过学习这些项目源码提升自己对数据库的理解。
PickleDB
PickleDB 是一个轻量级的键值存储数据库,采用 Python 编写,使用 JSON 文件格式来存储数据。它旨在提供一个简单、易用的接口来存储和检索数据,适用于小型项目或需要快速实现持久化存储的场景。
主要特点
轻量级:PickleDB 是一个非常轻量级的数据库,适合于对性能和复杂性要求不高的小型应用。由于其简单的设计和实现,PickleDB 不适合用于大型数据集或高并发场景。
简单的 API:提供类似于 Python 字典的 API,让用户可以通过简单的键值对操作来管理数据。这使得 PickleDB 非常易于学习和使用。
基于 JSON 存储:数据以 JSON 格式存储在磁盘上,这使得数据可以被轻松地读取和修改,同时也便于与其他系统进行数据交换。
持久化存储:数据库的内容会被持久化到磁盘上的 JSON 文件中,保证了程序重启后数据不会丢失。
无依赖性:PickleDB 不依赖于任何外部数据库系统,只需 Python 环境即可运行。
使用场景
配置存储:可以用来存储应用程序的配置数据,尤其是那些不需要频繁更改的配置。
小型项目:对于需要快速开发的小型项目,PickleDB 是一个不错的选择,因其简单易用且无需复杂的数据库配置。
学习和教学:由于其简单的 API 和实现,PickleDB 是学习和教学基本数据库操作的好工具。
临时数据存储:可以用于存储一些临时的数据,尤其是在开发阶段或测试阶段。
注意事项
性能和规模限制:由于其基于 JSON 文件的存储方式,PickleDB 在处理大规模数据时性能可能较差,不适合高并发和大数据量的场景。
数据安全性:JSON 文件存储方式缺乏加密和访问控制机制,因此不适合存储敏感数据。
基本用法
import pickledb
# 创建或打开一个数据库
db = pickledb.load('example.db', auto_dump=True)
# 插入数据
db.set('key1', 'value1')
# 获取数据
value = db.get('key1')
print(value) # 输出: value1
# 检查键是否存在
exists = db.exists('key1')
print(exists) # 输出: True
# 删除数据
db.rem('key1')
# 获取所有键
keys = db.getall()
print(keys)
# 设置自动保存
db.dump()
TinyDBTinyDB 是一个用 Python 编写的轻量级、面向文档的 NoSQL 数据库。它非常适合小型项目和嵌入式应用,因为它不需要任何外部依赖,并且可以直接将数据存储在 JSON 文件中。TinyDB 的设计目标是提供一个简单易用的数据库接口,同时保持足够的灵活性以满足多种应用需求。
主要特点
轻量级和嵌入式:TinyDB 完全用 Python 编写,不需要安装任何数据库服务器或其他依赖。它是一个嵌入式数据库,数据直接存储在本地文件中。
面向文档:数据以文档的形式存储,每个文档都是一个字典对象,可以包含任意层次的嵌套结构。
简单的 API:提供类似于 Python 数据结构的 API,用户可以通过简单的增删改查操作来管理数据。
查询语言:TinyDB 提供了一套强大的查询语言,支持复杂的查询条件、组合查询和正则表达式匹配。
可扩展性:支持插件机制,可以通过编写自定义存储引擎和中间件来扩展其功能。
事务支持:TinyDB 支持基本的事务操作,确保数据操作的原子性。
使用场景
小型项目:TinyDB 非常适合小型项目,尤其是在需要快速开发并且不想设置复杂数据库系统的情况下。
嵌入式应用:由于其轻量级和无依赖性,TinyDB 是嵌入式系统或桌面应用的理想选择。
原型开发:在开发早期阶段,可以使用 TinyDB 快速实现数据存储和检索,后续如果需要可以迁移到更复杂的数据库系统。
配置存储:可以用来存储应用程序的配置数据,特别是需要持久化且结构化的配置。
注意事项
性能和规模限制:TinyDB 适合小型数据集,对于大型数据集或高并发访问场景,性能可能会受到限制。
文件存储:由于数据存储在 JSON 文件中,读写性能会随着文件大小增加而下降。
TinyDB 提供了一个简单且灵活的方式来管理小型数据集,适用于需要快速、简单数据存储解决方案的场合。通过其直观的 API 和强大的查询能力,开发者可以轻松实现数据的增删改查操作。
基本用法
from tinydb import TinyDB, Query
# 创建或打开一个数据库
db = TinyDB('db.json')
# 插入数据
db.insert({'name': 'John', 'age': 22})
db.insert({'name': 'Jane', 'age': 25})
# 查询数据
User = Query()
result = db.search(User.name == 'John')
print(result) # 输出: [{'name': 'John', 'age': 22}]
# 更新数据
db.update({'age': 23}, User.name == 'John')
# 删除数据
db.remove(User.name == 'Jane')
# 获取所有数据
all_data = db.all()
print(all_data)
# 关闭数据库
db.close()
ZODBZODB(Zope Object Database)是一个面向对象的数据库系统,用于在 Python 中存储持久性对象。与传统的关系型数据库不同,ZODB 直接存储 Python 对象,而不是将数据转换为表格形式。这使得它非常适合需要持久化复杂数据结构的应用程序,尤其是在 Python 环境中。
主要特点
面向对象:ZODB 允许直接存储和检索 Python 对象,包括复杂的数据结构和对象图。这消除了对象与关系之间的映射过程,使开发更加自然和简洁。
透明持久性:对象的持久性对开发者是透明的。只需将对象存储在数据库中,ZODB 会自动处理序列化和反序列化操作。
事务支持:ZODB 支持 ACID 事务,确保数据操作的原子性、一致性、隔离性和持久性。这对于需要保证数据一致性的应用非常重要。
版本控制和历史记录:ZODB 支持对象的版本控制和历史记录功能,可以方便地回滚到之前的状态。
可扩展性:ZODB 可以通过多种存储机制扩展,包括文件存储、内存存储和网络存储,以满足不同的需求。
无模式:由于 ZODB 是面向对象的数据库,因此不需要预定义模式。这使得应用程序在设计和实现上更加灵活。
使用场景
复杂对象持久化:适用于需要持久化复杂对象和数据结构的应用,如内容管理系统、科学计算应用等。
Python 应用:由于 ZODB 与 Python 对象模型的紧密集成,它特别适合于需要与 Python 紧密结合的应用程序。
需要事务支持的应用:任何需要确保数据一致性和完整性的应用程序都可以从 ZODB 的事务支持中受益。
注意事项
性能和规模:ZODB 适合中小型应用,对于非常大的数据集或需要高性能的场景,可能需要进行性能优化或考虑其他数据库解决方案。
学习曲线:对于习惯于关系型数据库的开发者,可能需要时间来适应 ZODB 的面向对象模型。
社区和生态:ZODB 的社区和生态相对较小,可能需要自行解决一些特定的问题。
基本用法
import transaction
from ZODB import FileStorage, DB
import persistent
# 定义一个持久化对象类
class Person(persistent.Persistent):
def __init__(self, name, age):
self.name = name
self.age = age
# 创建一个文件存储和数据库
storage = FileStorage.FileStorage('mydata.fs')
db = DB(storage)
# 获取数据库连接
connection = db.open()
root = connection.root()
# 添加对象到数据库
root['person'] = Person('John Doe', 30)
# 提交事务
transaction.commit()
# 检索对象
person = root['person']
print(person.name, person.age)
# 关闭连接和存储
connection.close()
db.close()
storage.close()
DurusDurus 是一个用 Python 编写的持久化存储系统,旨在提供一个简单的、面向对象的数据库解决方案。与 ZODB 类似,Durus 允许开发者将 Python 对象持久化到磁盘上,但它的设计更加轻量级和简单,适合于对复杂性要求不高的项目。类似于 ZODB,但更轻量级。提供了对象持久化的功能,并支持事务。
Durus 的主要特点
面向对象:Durus 是一个面向对象的数据库,支持直接存储和检索 Python 对象。这使得应用程序可以更自然地管理数据,而不需要将对象转换为关系型数据库的表格形式。
持久化存储:数据库将对象持久化到磁盘文件中,确保数据在程序重启后仍然可用。
事务支持:Durus 支持基本的事务机制,确保数据操作的原子性和一致性。事务使得应用程序可以在出现错误时回滚数据变更。
简单易用:urus 的 API 设计简洁,易于学习和使用。适合小型项目和需要快速开发的应用。
轻量级:由于其简单的设计和实现,Durus 非常轻量级,不需要复杂的配置或依赖。
使用场景
小型项目:适用于需要简单数据持久化的项目,尤其是那些不需要复杂查询和高性能的应用。
Python 应用:由于其与 Python 对象的紧密集成,Durus 是需要持久化 Python 对象的应用程序的理想选择。
快速开发和原型:在开发早期阶段,可以使用 Durus 快速实现数据存储和检索,后续如果需要可以迁移到更复杂的数据库系统。
注意事项
性能和规模限制:Durus 适合小型数据集,对于大型数据集或需要高性能的场景,可能需要考虑其他数据库解决方案。
功能特性:Durus 提供的功能相对简单,不支持复杂的查询和索引。
社区支持:Durus 的社区和生态相对较小,可能需要自行解决一些特定的问题。
基本用法
from durus.persistent import Persistent
from durus.connection import Connection
from durus.storage import FileStorage
# 定义一个持久化对象类
class Person(Persistent):
def __init__(self, name, age):
self.name = name
self.age = age
# 创建一个文件存储和连接
storage = FileStorage('mydata.durus')
connection = Connection(storage)
# 获取根对象
root = connection.get_root()
# 添加对象到数据库
root['person'] = Person('John Doe', 30)
# 提交事务
connection.commit()
# 检索对象
person = root['person']
print(person.name, person.age)
# 关闭连接和存储
connection.close()
storage.close()
BuzhugBuzhug 是一个用 Python 编写的轻量级数据库,旨在提供简单的数据库解决方案。它是一种纯 Python 实现的数据库,支持类 SQL 的查询语言,但与传统的关系型数据库相比,它更加轻量和简洁。Buzhug 适用于小型项目和教学用途,尤其是那些不需要复杂的数据库功能的场景。
主要特点
纯 Python 实现:Buzhug 完全用 Python 编写,这使得它非常易于安装和使用,无需依赖其他数据库系统或外部库。
类 SQL 查询:支持类 SQL 的查询语言,使得用户可以通过熟悉的 SQL 语法进行数据操作。
轻量级:由于其简单的设计和实现,Buzhug 是一个轻量级的数据库,非常适合于小型项目和学习用途。
易于使用:Buzhug 的 API 设计直观,适合 Python 初学者和需要快速开发的项目。
无模式限制:数据库没有严格的模式限制,用户可以灵活地添加和修改字段。
使用场景
小型项目:适用于需要简单数据存储的项目,尤其是那些不需要复杂查询和高性能的应用。
教学和学习:由于其简单的实现和类 SQL 的查询支持,Buzhug 是学习数据库基本概念和 SQL 查询的好工具。
快速开发和原型:在开发早期阶段,可以使用 Buzhug 快速实现数据存储和检索,后续如果需要可以迁移到更复杂的数据库系统。
注意事项
性能和规模限制:由于 Buzhug 是纯 Python 实现,性能和功能有限,适合小型数据集和简单应用。
社区支持:Buzhug 的社区和生态系统相对较小,可能需要自行解决一些特定的问题。
功能特性:Buzhug 提供的功能相对简单,不支持复杂的事务和索引。
基本用法
from buzhug import Base
# 创建或打开一个数据库
db = Base('people').create(('name', str), ('age', int))
# 插入数据
db.insert(name='John Doe', age=30)
db.insert(name='Jane Doe', age=25)
# 查询数据
for person in db.select():
print(person.name, person.age)
# 更新数据
db.update(db.name == 'John Doe', age=31)
# 删除数据
db.delete(db.name == 'Jane Doe')
# 关闭数据库
db.close()
GadflyGadfly 是一个用 Python 编写的轻量级关系型数据库系统,旨在提供一个简单的、纯 Python 的数据库解决方案。它完全用 Python 实现,支持 SQL 查询语言,使得开发者可以在不依赖外部数据库系统的情况下处理关系型数据。Gadfly 适合教学、学习和小型项目,尤其是那些不需要高性能或复杂功能的场景。
主要特点
纯 Python 实现:Gadfly 完全用 Python 编写,这意味着它可以在任何支持 Python 的环境中运行,无需安装其他数据库软件。
SQL 支持:Gadfly 支持标准 SQL 查询语言,使得用户可以使用熟悉的 SQL 语法进行数据操作。这对于需要关系型数据管理的应用非常有用。
轻量级:由于其简单的设计和实现,Gadfly 是一个轻量级的数据库,适合于小型项目和教学用途。
嵌入式数据库:Gadfly 是一个嵌入式数据库,不需要服务器或复杂的配置,可以直接在应用程序中使用。
使用场景
教学和学习:Gadfly 是学习 SQL 和数据库基本概念的好工具,因为它不需要复杂的安装和配置。
小型项目:适用于需要简单关系型数据存储的项目,尤其是那些不需要高性能的应用。
快速开发和原型:在开发早期阶段,可以使用 Gadfly 快速实现数据存储和检索,后续如果需要可以迁移到更复杂的数据库系统。
注意事项
性能和规模限制:由于 Gadfly 是纯 Python 实现,性能和功能有限,适合小型数据集和简单应用。
社区支持:Gadfly 的社区和生态系统相对较小,开发活跃度不高,可能需要自行解决一些特定的问题。
兼容性:由于 Gadfly 的开发历史较早,可能在现代 Python 环境中需要进行一些兼容性调整。
基本用法
from gadfly import gadfly
# 创建或连接到一个数据库
connection = gadfly('mydb', 'mydb_directory')
# 获取游标
cursor = connection.cursor()
# 创建表
cursor.execute('CREATE TABLE people (name VARCHAR, age INTEGER)')
# 插入数据
cursor.execute('INSERT INTO people (name, age) VALUES ('John Doe', 30)')
cursor.execute('INSERT INTO people (name, age) VALUES ('Jane Doe', 25)')
# 查询数据
cursor.execute('SELECT * FROM people')
for row in cursor.fetchall():
print(row)
# 更新数据
cursor.execute('UPDATE people SET age = 31 WHERE name = 'John Doe'')
# 删除数据
cursor.execute('DELETE FROM people WHERE name = 'Jane Doe'')
# 提交事务
connection.commit()
# 关闭连接
connection.close()
PyTablesPyTables 是一个用于管理大量科学数据的开源库,基于 HDF5(Hierarchical Data Format version 5)文件格式。它专为需要高效存储和检索大规模数据的科学计算和数据分析应用而设计。PyTables 提供了一个强大的数据管理工具,支持复杂的数据结构和高效的压缩和检索操作。
主要特点
基于 HDF5:PyTables 使用 HDF5 作为底层存储格式,这是一种用于存储和管理大规模数据的成熟格式,广泛用于科学计算领域。
高效的数据压缩和存储:支持多种压缩算法(如 Zlib、LZO、BZIP2),可以有效地减少存储空间,同时提供高效的数据访问。
层次结构:支持层次结构的数据组织方式,允许用户以文件系统的方式管理数据集和组(类似于文件夹和文件)。
大数据集处理:适合处理无法完全加载到内存中的大数据集,支持部分数据的读取和写入。
数据类型支持:支持多种数据类型,包括数值、字符串、对象数组等,适合多样化的数据存储需求。
查询和检索:提供强大的查询功能,允许用户根据条件高效地检索数据。
与 NumPy 集成:与 NumPy 紧密集成,支持将数据集直接转换为 NumPy 数组,便于进行数值计算和分析。
安装
PyTables 可以通过 pip 安装:pip install tables
基本用法
import numpy as np
import tables
# 创建一个 HDF5 文件
with tables.open_file('example.h5', mode='w') as file:
# 创建一个组
group = file.create_group('/', 'data_group', 'Data Group')
# 创建一个数组
data = np.array([(1, 'Hello'), (2, 'World')], dtype=[('number', 'i4'), ('word', 'S10')])
table = file.create_table(group, 'example_table', description=data.dtype, title='Example Table')
# 插入数据
row = table.row
for item in data:
row['number'] = item['number']
row['word'] = item['word']
row.append()
table.flush()
# 查询数据
for row in table.where('number > 1'):
print(row['number'], row['word'].decode('utf-8'))
# 读取数据到 NumPy 数组
np_data = table.read()
print(np_data)
使用场景
科学计算和数据分析:适用于需要存储和处理大规模科学数据的应用,如气象数据、基因组数据、物理模拟等。
大数据集管理:在需要处理超过内存容量的大数据集时,PyTables 提供了高效的存储和检索机制。
数据归档和共享:HDF5 格式的广泛支持使得 PyTables 非常适合用于数据归档和共享。
注意事项
性能调优:虽然 PyTables 本身提供了高效的存储和检索功能,但性能仍可能受到数据结构、压缩方式等因素的影响,用户可能需要根据具体需求进行调优。
依赖库:PyTables 依赖于 HDF5 库,因此在安装时需要确保 HDF5 库的正确配置。
数据兼容性:虽然 HDF5 是一个跨平台的文件格式,但在不同环境间移动数据时仍需注意版本兼容性。
⬆️关注:领取Python、机器学习资料包⬆️