Python项目适用的轻量级和嵌入式数据库汇总

 更新时间:2025年12月05日 09:13:57   作者:学亮编程手记  
本文介绍了多种Python轻量级和嵌入式数据库的分类及其特点,包括SQLite、TinyDB、PickleDB、Shelve、DuckDB等,每种数据库都有其特定的应用场景和优势,下面小编为大家详细说说,需要的朋友可以参考下

除了SQLite,Python还有许多其他轻量级和嵌入式数据库选项。以下是详细分类介绍:

1.嵌入式/文件型数据库

a)TinyDB(纯Python, NoSQL)

# 安装: pip install tinydb
from tinydb import TinyDB, Query

# 使用示例
db = TinyDB('db.json')
db.insert({'name': 'John', 'age': 30})
results = db.search(Query().age > 25)

特点

  • JSON格式存储
  • 无外部依赖
  • 支持查询和索引
  • 适合小型项目、配置存储

b)PickleDB(基于pickle的键值存储)

# 安装: pip install pickledb
import pickledb

db = pickledb.load('example.db', False)
db.set('key', 'value')
value = db.get('key')

c)Shelve(Python标准库)

import shelve

with shelve.open('mydata') as db:
    db['key1'] = {'name': 'Alice', 'age': 25}
    data = db['key1']  # 读取数据

d)DuckDB(高性能分析型数据库)

# 安装: pip install duckdb
import duckdb

# 内存数据库
conn = duckdb.connect(':memory:')
# 或文件数据库
conn = duckdb.connect('mydb.duckdb')

conn.execute("CREATE TABLE users (id INTEGER, name VARCHAR)")
conn.execute("INSERT INTO users VALUES (1, 'Alice')")
result = conn.execute("SELECT * FROM users").fetchall()

特点

  • 列式存储
  • OLAP优化
  • SQL支持完整
  • 比SQLite在某些分析查询上快100倍

e)UnQLite(键值/文档存储)

# 安装: pip install unqlite
import unqlite

db = unqlite.UnQLite('mydb.db')
db['key1'] = 'value1'  # 键值存储
db.store('users', {'name': 'John'})  # 文档存储

2.客户端-服务器轻量级数据库

a)SQLite (网络版) - rqlite

# 需要安装rqlite服务器
# pip install rqlite-python
import rqlite

conn = rqlite.connect('http://localhost:4001')
conn.execute('CREATE TABLE users (id INTEGER, name TEXT)')

b)PocketBase(后端即服务)

# 需要PocketBase服务
# pip install pocketbase
from pocketbase import PocketBase

client = PocketBase('http://127.0.0.1:8090')
records = client.collection('posts').get_list()

3.时序数据库

a)QuestDB

# 安装: pip install questdb
from questdb.ingress import Sender, IngressError

sender = Sender('localhost', 9009)
sender.row(
    'weather',
    symbols={'city': 'London'},
    columns={'temperature': 23.5, 'humidity': 0.49}
)
sender.flush()

b)TimescaleDB(PostgreSQL扩展)

# 基于PostgreSQL,但针对时序优化
# pip install psycopg2
import psycopg2

conn = psycopg2.connect("dbname=tsdb user=postgres")

4.内存数据库

a)Redis(键值存储)

# 安装: pip install redis
import redis

r = redis.Redis(host='localhost', port=6379, db=0)
r.set('foo', 'bar')
value = r.get('foo')

b)Memcached

# 安装: pip install python-memcached
import memcache

mc = memcache.Client(['127.0.0.1:11211'], debug=0)
mc.set("some_key", "Some value")
value = mc.get("some_key")

5.Python原生数据库

a)ZODB(对象数据库)

# 安装: pip install ZODB
from ZODB import DB
import transaction

db = DB('mydatabase.fs')
conn = db.open()
root = conn.root()

root['users'] = ['Alice', 'Bob']
transaction.commit()

b)Metakit(嵌入式)

# 安装可能较复杂,需编译
import metakit

db = metakit.storage('data.mk')
view = db.getas('users[name:S,age:I]')
view.append(name='John', age=30)

6.特殊用途数据库

a)CodernityDB(纯Python实现)

# 安装: pip install CodernityDB
from CodernityDB.database import Database

db = Database('/tmp/test')
db.create()

b)Kyoto Cabinet(键值存储)

# 安装: pip install kyotocabinet
import kyotocabinet

db = kyotocabinet.DB()
db.open('test.kch', kyotocabinet.DB.OWRITER | kyotocabinet.DB.OCREATE)
db.set('key', 'value')

7.NewSQL/分布式轻量级

a)TiDB(兼容MySQL的分布式)

# 安装MySQL客户端
# pip install PyMySQL
import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=4000,
    user='root',
    database='test'
)

b)CockroachDB

# 安装: pip install psycopg2
import psycopg2

conn = psycopg2.connect(
    host='localhost',
    port=26257,
    user='root',
    database='defaultdb'
)

选择建议表格

数据库类型适合场景特点
SQLiteSQL/嵌入式本地应用、移动应用零配置、单文件
TinyDBNoSQL/JSON小型项目、配置存储纯Python、简单
DuckDBSQL/分析型数据分析、OLAP列式存储、高性能
UnQLite键值/文档简单存储需求支持JSON
Redis键值/内存缓存、会话存储高性能、支持数据结构
ZODB对象数据库Python对象存储直接存储Python对象
Shelve键值/标准库简单持久化Python自带、简单
rqliteSQL/分布式需要复制的SQLite基于Raft、分布式

综合示例:根据场景选择

"""
不同场景下的数据库选择示例
"""

def scenario_based_selection():
    print("根据使用场景选择数据库:")
    
    scenarios = {
        "移动应用/桌面应用": "SQLite",
        "Web应用缓存": "Redis",
        "小型项目原型": "TinyDB",
        "数据分析/OLAP": "DuckDB",
        "需要分布式": "rqlite 或 TiDB",
        "存储Python对象": "ZODB 或 Shelve",
        "时序数据": "QuestDB 或 TimescaleDB",
        "键值存储": "UnQLite 或 Kyoto Cabinet",
        "纯内存操作": "Python字典 + pickle",
        "需要完整SQL功能": "SQLite",
        "文档存储": "TinyDB",
        "需要事务支持": "SQLite",
        "零依赖部署": "SQLite 或 TinyDB",
        "高并发读写": "Redis",
        "持久化缓存": "Shelve",
        "配置存储": "JSON文件 或 TinyDB"
    }
    
    for scenario, recommendation in scenarios.items():
        print(f"  {scenario:25} → {recommendation}")

# 快速选择指南函数
def quick_selection_guide():
    """
    快速选择指南
    """
    questions = [
        ("需要完整SQL支持吗?", {"是": ["SQLite", "DuckDB"], "否": ["TinyDB", "Redis"]}),
        ("数据量有多大?", {"<100MB": ["SQLite", "TinyDB"], ">100MB": ["DuckDB", "外部数据库"]}),
        ("需要网络访问吗?", {"是": ["Redis", "rqlite"], "否": ["SQLite", "TinyDB"]}),
        ("性能要求高吗?", {"是": ["DuckDB", "Redis"], "否": ["SQLite", "TinyDB"]}),
        ("需要事务支持吗?", {"是": ["SQLite", "DuckDB"], "否": ["TinyDB", "Redis"]}),
        ("部署环境有限制吗?", {"是": ["SQLite", "TinyDB"], "否": "所有选择"}),
        ("主要做什么操作?", {
            "查询分析": ["DuckDB"],
            "缓存": ["Redis"],
            "简单存储": ["TinyDB", "Shelve"],
            "复杂关系": ["SQLite"]
        })
    ]
    
    return questions

if __name__ == "__main__":
    scenario_based_selection()
    
    print("\n推荐选择优先级:")
    print("1. 首选SQLite - 成熟稳定,功能完整")
    print("2. 考虑DuckDB - 数据分析场景")
    print("3. 选择TinyDB - 简单JSON存储需求")
    print("4. 使用Redis - 缓存和高并发场景")
    print("5. 尝试ZODB - 需要直接存储Python对象时")

实际项目建议

小型项目/原型开发:

# 方案1:SQLite(最通用)
import sqlite3
conn = sqlite3.connect('app.db')

# 方案2:TinyDB(更简单)
from tinydb import TinyDB
db = TinyDB('db.json')

# 方案3:DuckDB(数据分析)
import duckdb
conn = duckdb.connect('analytics.db')

Web应用:

# 主数据库:SQLite/PostgreSQL
# 缓存:Redis
# 会话存储:Redis或SQLite

数据分析:

# 首选DuckDB,次选SQLite
import duckdb
import pandas as pd

# 直接在Pandas DataFrame上查询
df = pd.read_csv('data.csv')
result = duckdb.query("SELECT * FROM df WHERE column > 100").df()

嵌入式/IoT:

# 使用SQLite(资源占用小)
# 或TinyDB(无依赖)

注意事项

SQLite仍然是最佳通用选择,因为:

  • 零配置
  • 单文件
  • ACID事务
  • 标准SQL支持
  • Python标准库支持

考虑因素

  • 数据量大小
  • 并发需求
  • 查询复杂度
  • 部署环境限制
  • 开发团队熟悉度

迁移成本

  • 从SQLite迁移到其他数据库相对容易
  • 从小型数据库迁移到大型数据库比反向迁移容易

总的来说,对于大多数Python项目:

  • 首选SQLite - 80%的场景都适用
  • 数据分析选DuckDB - 比SQLite在某些查询上快100倍
  • 简单存储选TinyDB - 不需要SQL时
  • 缓存选Redis - 需要高性能缓存时

以上就是Python项目适用的轻量级和嵌入式数据库汇总的详细内容,更多关于Python轻量级和嵌入式数据库的资料请关注脚本之家其它相关文章!

相关文章

  • 详解python和matlab的优势与区别

    详解python和matlab的优势与区别

    在本文中小编给大家分享的是关于python和matlab的优势与区别的知识点以及实例代码,需要的朋友们参考学习下。
    2019-06-06
  • Python实现将Excel某范围单元格内容截图

    Python实现将Excel某范围单元格内容截图

    Openpyxl是一个强大的Python库,主要用于读取、写入和操作Excel文件,本文将使用Openpyxl实现将Excel某范围单元格内容截图,感兴趣的可以了解下
    2024-11-11
  • Python3的高阶函数map,reduce,filter的示例详解

    Python3的高阶函数map,reduce,filter的示例详解

    这篇文章主要介绍了Python3的高阶函数map,reduce,filter的示例代码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Python self参数详细介绍

    Python self参数详细介绍

    事实上,Python只是规定,无论是构造方法还是实例方法,最少要包含一个参数,并没有规定该参数的具体名称。之所以将其命名为self,只是程序员之间约定俗成的一种习惯,遵守这个约定,可以使我们编写的代码具有更好的可读性
    2023-01-01
  • Python之求任意正整数的阶乘方式

    Python之求任意正整数的阶乘方式

    这篇文章主要介绍了Python之求任意正整数的阶乘方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • SecureCRTSecure7.0查看连接密码的步骤

    SecureCRTSecure7.0查看连接密码的步骤

    SecureCRTSecure7密码查看的方法大概可以分为两个步骤,第一步需要查看系统保存的连接的ini文件,第二步破解加密之后的密码,具体脚本请参考下本文
    2021-06-06
  • python实现txt文件格式转换为arff格式

    python实现txt文件格式转换为arff格式

    这篇文章主要为大家详细介绍了python实现txt文件格式转换为arff格式的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Python如何将JavaScript转换为json

    Python如何将JavaScript转换为json

    文章介绍了如何使用Python的re模块将JavaScript代码转换为JSON格式,首先,使用正则表达式匹配并替换JavaScript代码中的数字,确保它们被双引号括起来,然后,使用另一个正则表达式匹配并替换JavaScript代码中的键值对,确保键和值都被双引号括起来
    2025-02-02
  • Python实现钉钉/企业微信自动打卡的示例代码

    Python实现钉钉/企业微信自动打卡的示例代码

    这篇文章主要介绍了Python实现钉钉/企业微信自动打卡的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • python神经网络Inception ResnetV2模型复现详解

    python神经网络Inception ResnetV2模型复现详解

    这篇文章主要为大家介绍了python神经网络Inception ResnetV2模型复现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论