除了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'
)
选择建议表格
| 数据库 | 类型 | 适合场景 | 特点 |
|---|---|---|---|
| sqlite | sql/嵌入式 | 本地应用、移动应用 | 零配置、单文件 |
| tinydb | nosql/json | 小型项目、配置存储 | 纯python、简单 |
| duckdb | sql/分析型 | 数据分析、olap | 列式存储、高性能 |
| unqlite | 键值/文档 | 简单存储需求 | 支持json |
| redis | 键值/内存 | 缓存、会话存储 | 高性能、支持数据结构 |
| zodb | 对象数据库 | python对象存储 | 直接存储python对象 |
| shelve | 键值/标准库 | 简单持久化 | python自带、简单 |
| rqlite | sql/分布式 | 需要复制的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轻量级和嵌入式数据库的资料请关注代码网其它相关文章!
发表评论