A unified table storage abstraction library with support for multiple backends
Project description
FunTable
一个统一的表存储抽象库,为各种存储后端(包括 SQLite、TinyDB、SQLModel 和云存储快照)提供一致的接口。
特性
- 统一接口: 跨不同存储后端的一致 API
- 多种存储类型: 支持 KV(键值)和 KKV(键键值)存储模式
- 事务支持: 内置事务管理,确保数据一致性
- 多种后端: 支持 SQLite、TinyDB、SQLModel 和云存储
- 快照管理: 自动备份和版本管理,支持云存储
- 线程安全: 为并发访问场景而设计
安装
基础安装
pip install funtable
安装可选依赖
# 支持 SQLModel
pip install funtable[sqlmodel]
# 支持快照/云存储
pip install funtable[snapshot]
# 支持 TinyDB
pip install funtable[kv]
# 安装所有可选依赖
pip install funtable[sqlmodel,snapshot,kv]
快速开始
KV(键值)存储
from funtable.kv import SQLiteDB
# 初始化数据库
db = SQLiteDB("my_database.db")
# 创建 KV 表
db.create_kv_table("users")
table = db.get_table("users")
# 存储数据
table.set("user1", {"name": "Alice", "age": 30})
table.set("user2", {"name": "Bob", "age": 25})
# 检索数据
user = table.get("user1")
print(user) # {"name": "Alice", "age": 30}
# 列出所有键
keys = table.list_keys()
print(keys) # ["user1", "user2"]
# 获取所有数据
all_data = table.list_all()
print(all_data)
KKV(键键值)存储
from funtable.kv import SQLiteDB
# 初始化数据库
db = SQLiteDB("my_database.db")
# 创建 KKV 表
db.create_kkv_table("user_profiles")
table = db.get_table("user_profiles")
# 使用两级键存储数据
table.set("user1", "profile", {"bio": "Software Engineer"})
table.set("user1", "settings", {"theme": "dark", "notifications": True})
table.set("user2", "profile", {"bio": "Data Scientist"})
# 检索数据
profile = table.get("user1", "profile")
print(profile) # {"bio": "Software Engineer"}
# 列出主键
pkeys = table.list_pkeys()
print(pkeys) # ["user1", "user2"]
# 列出某个主键的次键
skeys = table.list_skeys("user1")
print(skeys) # ["profile", "settings"]
事务支持
# 使用事务确保数据一致性
table.begin_transaction()
try:
table.set("user3", {"name": "Charlie", "age": 35})
table.set("user4", {"name": "David", "age": 40})
table.commit()
except Exception as e:
table.rollback()
print(f"事务失败: {e}")
SQLModel 集成
from funtable.sqlmodel import BaseModel
from sqlmodel import Field
from datetime import datetime
class User(BaseModel, table=True):
name: str = Field(description="用户名")
email: str = Field(description="用户邮箱")
age: int = Field(description="用户年龄")
# BaseModel 提供内置字段:
# - id: 自增主键
# - uid: 唯一标识符
# - gmt_create: 创建时间戳
# - gmt_modified: 修改时间戳
# 与 SQLModel session 一起使用
from sqlmodel import create_engine, Session
engine = create_engine("sqlite:///users.db")
with Session(engine) as session:
user = User(name="Alice", email="alice@example.com", age=30)
session.add(user)
session.commit()
# 查询方法
all_users = User.all(session)
user_by_id = User.by_id(1, session)
user_by_uid = User.by_uid("some-uid", session)
快照管理
from funtable.snapshot import DriveSnapshot
from fundrive import SomeDriveImplementation
# 初始化驱动器和快照管理器
drive = SomeDriveImplementation()
snapshot = DriveSnapshot(
table_fid="my-table-id",
drive=drive,
num=7 # 保留 7 个版本
)
# 创建快照
snapshot.update("/path/to/data", partition="20231201")
# 下载最新快照
snapshot.download("/path/to/restore")
存储后端
SQLite 后端
- 文件:
funtable.kv.sqlite_table - 特性: ACID 事务、SQL 查询、基于文件的存储
- 适用于: 生产应用、复杂查询、数据完整性
TinyDB 后端
- 文件:
funtable.kv.tinydb_table - 特性: 基于 JSON、轻量级、无外部依赖
- 适用于: 小型应用、原型开发、简单数据结构
SQLModel 集成
- 文件:
funtable.sqlmodel.base - 特性: ORM 功能、类型安全、Pydantic 集成
- 适用于: 现代 Python 应用、API 开发、数据验证
云存储快照
- 文件:
funtable.snapshot.core - 特性: 自动备份、版本管理、云集成
- 适用于: 数据备份、灾难恢复、分布式系统
API 参考
核心接口
BaseKVTable
set(key: str, value: Dict) -> None: 存储键值对get(key: str) -> Optional[Dict]: 通过键检索值delete(key: str) -> bool: 删除键值对list_keys() -> List[str]: 获取所有键list_all() -> Dict[str, Dict]: 获取所有键值对begin_transaction(),commit(),rollback(): 事务管理
BaseKKVTable
set(pkey: str, skey: str, value: Dict) -> None: 使用两级键存储get(pkey: str, skey: str) -> Optional[Dict]: 通过两级键检索delete(pkey: str, skey: str) -> bool: 通过两级键删除list_pkeys() -> List[str]: 获取所有主键list_skeys(pkey: str) -> List[str]: 获取主键的次键list_all() -> Dict[str, Dict[str, Dict]]: 获取所有数据batch_set(items: Dict) -> None: 批量插入操作batch_delete(items: List[tuple]) -> None: 批量删除操作
BaseDB
create_kv_table(table_name: str) -> None: 创建 KV 表create_kkv_table(table_name: str) -> None: 创建 KKV 表get_table(table_name: str) -> Union[BaseKVTable, BaseKKVTable]: 获取表实例list_tables() -> Dict[str, str]: 列出所有表及其类型drop_table(table_name: str) -> None: 删除表
错误处理
所有存储操作都可能引发 StoreError 异常:
from funtable.kv.interface import StoreError
try:
table.set("key", {"data": "value"})
except StoreError as e:
print(f"存储错误: {e}")
if e.cause:
print(f"原因: {e.cause}")
贡献
- Fork 仓库
- 创建功能分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 打开 Pull Request
许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件。
链接
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
funtable-1.0.41-py3-none-any.whl
(18.5 kB
view details)
File details
Details for the file funtable-1.0.41-py3-none-any.whl.
File metadata
- Download URL: funtable-1.0.41-py3-none-any.whl
- Upload date:
- Size: 18.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4f40cae517a746d9f2b68359e7cd032dc4ccf3b2b7832724f3aa7d3ef812be2
|
|
| MD5 |
67e6902c537e0da81d445347669f4e3e
|
|
| BLAKE2b-256 |
45a66760c69ec39147e7299a236bccf9205ced845164a9f76205ae45a778d118
|