Lightweight single-engine Python document database - pytuck format only, no SQL, high-performance embedded storage
Project description
Pytucky
Pytucky 是一个纯 Python、零第三方运行时依赖、单文件的嵌入式文档数据库。
基于 Pytuck 的核心 ORM API(Column、declarative_base、Session、select/insert/update/delete),收敛为 PTK7 单引擎实现。专为受限 Python 环境(如 Ren'Py)设计,提供类似 SQLAlchemy 的声明式 ORM 体验。
| 格式 | PTK7 / 默认 .pytuck(显式 .pytucky 兼容) |
| 运行时依赖 | 无 |
| Python | >= 3.10 |
| 许可证 | MIT |
核心特性
- 纯 Python:适合受限运行环境(如 Ren'Py)
- 零第三方运行时依赖:安装简单,部署轻量
- 单文件数据库:一个
.pytuck文件即可承载完整数据(显式.pytucky仍兼容) - 类似 SQLAlchemy 的 ORM:声明式模型、Session、Statement API
- 跨 Storage relationship / prefetch:支持把基础库与用户库通过 relationship 关联起来
- 与 pytuck 共享 PTK7 格式:已验证
None / low / medium / high四档可双向互读互写 - 默认按需读取:打开时只加载目录和索引元数据,记录按需解码
- 主键直达读取:
pk -> (offset, length)直接定位记录 - 索引物化缓存:首次查询时物化,后续零解码开销
- 增量 flush:只写入有变更的表
安装
pip install pytucky
开发与发布
更完整的开发、测试与发布说明见 docs/guide/development.md。
如果你是克隆仓库后准备参与开发,不要使用 editable install 方式把项目本身装进当前环境,而是直接同步项目开发环境:
git clone <repo-url>
cd pytucky
uv sync --extra dev
快速开始
1. 直接使用 Storage
from pytucky import Storage, Column
db = Storage(file_path="demo.pytuck")
try:
db.create_table("users", [
Column(int, name="id", primary_key=True),
Column(str, name="name", index=True),
Column(int, name="age"),
])
alice_id = db.insert("users", {"name": "Alice", "age": 20})
bob_id = db.insert("users", {"name": "Bob", "age": 24})
print(db.select("users", bob_id))
db.flush()
finally:
db.close()
2. Session + PureBaseModel
from pytucky import Column, PureBaseModel, Session, Storage
from pytucky import declarative_base, insert, select
db = Storage(file_path="orm-demo.pytuck")
Base: type[PureBaseModel] = declarative_base(db)
class User(Base):
__tablename__ = "users"
id = Column(int, primary_key=True)
name = Column(str, nullable=False, index=True)
age = Column(int)
session = Session(db)
try:
session.execute(insert(User).values(name="Alice", age=20))
session.commit()
rows = session.execute(select(User).where(User.age >= 18)).all()
print([row.name for row in rows]) # ['Alice']
finally:
session.close()
db.close()
3. CRUDBaseModel(Active Record)
from pytucky import Column, CRUDBaseModel, Storage, declarative_base
db = Storage(file_path="crud-demo.pytuck")
Base: type[CRUDBaseModel] = declarative_base(db, crud=True)
class User(Base):
__tablename__ = "users"
id = Column(int, primary_key=True)
name = Column(str, nullable=False)
try:
user = User.create(name="Alice")
user.name = "Bob"
user.save()
loaded = User.get(1)
print(loaded.name) # Bob
finally:
db.close()
4. 跨 Storage relationship
from pytucky import Column, Relationship, Storage, declarative_base
base_db = Storage(file_path="base.pytuck")
user_db = Storage(file_path="user.pytuck")
BaseBase = declarative_base(base_db, crud=True)
BaseUser = declarative_base(user_db, crud=True)
class BaseItem(BaseBase):
__tablename__ = "base_items"
id = Column(int, primary_key=True)
name = Column(str)
class UserItem(BaseUser):
__tablename__ = "user_items"
id = Column(int, primary_key=True)
base_item_id = Column(int)
nickname = Column(str)
base_item = Relationship(
"base_items",
foreign_key="base_item_id",
storage=base_db,
) # type: ignore
try:
sword = BaseItem.create(name="Sword")
starter = UserItem.create(base_item_id=sword.id, nickname="starter")
print(starter.base_item.name) # Sword
finally:
user_db.close()
base_db.close()
说明:
Relationship("base_items", ...)里的字符串表示表名- 字符串目标省略
storage时默认同库;跨库读取时再显式传storage=... - 配置
back_populates后,懒加载和prefetch()都会自动回填反向缓存
性能(10,000 条记录)
当前基准环境:Darwin 25.4.0 / Python 3.13.11。对 pytucky 1.2.0 与 pytuck 1.3.0 使用相同 schema、相同数据量、相同测试流程连续运行 3 轮均值,唯一变量是库实现:
| 指标 | Pytucky 1.2.0 | Pytuck 1.3.0 | 变化 |
|---|---|---|---|
| insert | 35.2ms | 30.1ms | +17.2% |
| save | 25.2ms | 22.2ms | +13.1% |
| query_pk (×100) | 0.75ms | 0.69ms | +9.4% |
| query_indexed (×100) | 0.70ms | 0.64ms | +8.8% |
| load | 4.71ms | 4.74ms | -0.6% |
| reopen | 4.77ms | 4.72ms | +1.0% |
| reopen_first_query | 32.6μs | 35.6μs | -8.2% |
| file_size | 0.92MB | 0.92MB | 0% |
两个库共享 PTK7 格式。更完整的基准说明见 docs/guide/benchmark.md。
文档
| 文档 | 内容 |
|---|---|
| API 参考 | |
| docs/api/index.md | API 总览、导入参考 |
| docs/api/models.md | Column、Model、declarative_base、Relationship |
| docs/api/storage.md | Storage CRUD、表管理、事务、持久化 |
| docs/api/session.md | Session 对象管理、批量操作、Schema 操作 |
| docs/api/query.md | select/insert/update/delete、Result、逻辑操作符 |
| docs/api/exceptions.md | 异常层次与触发场景 |
| docs/api/best-practices.md | 持久化策略、性能优化、使用约束 |
| 指南 | |
| docs/guide/benchmark.md | 性能基准报告 |
| docs/guide/development.md | 开发指南 |
| CHANGELOG.md | 版本记录 |
从 pytuck 迁移
基础用法只需更改 import:
# 之前
from pytuck import Storage, declarative_base, Session, Column
# 之后
from pytucky import Storage, declarative_base, Session, Column
详见 docs/api/best-practices.md。
测试
uv run pytest tests/ -v
当前:205 passed
项目目标
- 纯 Python
- 零第三方运行时依赖
- 单文件
- 性能优先
- 保留基础 ORM 用法
许可证
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
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
File details
Details for the file pytucky-1.2.0-py3-none-any.whl.
File metadata
- Download URL: pytucky-1.2.0-py3-none-any.whl
- Upload date:
- Size: 98.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e66f13099758f293b1b06bc3a77f33c5769c175c10f4b7fba17d88d9054e1aba
|
|
| MD5 |
f90c3e27c144a87723fd789f1b8e3579
|
|
| BLAKE2b-256 |
caf6d5e27c1a2b689aa9d3ed18a662b7785082e9d99f2e9d7bda42ddc9302b69
|