未知
praekelt-python-gitmodel的Python项目详细描述
python的分布式版本化数据存储
python gitmodel是一个使用git进行版本控制来持久化对象的框架。 和远程同步
为什么?
根据Git’s README,git是一个“愚蠢的内容跟踪器”。那意味着你 不限于在git中存储源代码。这个项目的目标是 提供一个对象级接口,将git用作无模式数据存储,如 以及利用git强大的版本控制功能的工具
python gitmodel允许您使用python对数据建模,并提供 易于使用的接口,用于将数据存储为git对象。
python gitmodel基于libgit2,这是git核心的纯c实现 方法。这意味着,我们不通过shell调用git命令,而是 以本机速度使用git。
有什么了不起的?
- 无架构数据存储
- 永远不要丢失数据历史是永久保存的,可以使用git工具恢复。
- 分支并合并生产数据
- python gitmodel可以使用不同的分支
- 数据的分支或标记快照
- 使用分支测试生产数据,例如,测试迁移
- 非常适合内容驱动应用程序
示例用法
下面我们将介绍一个基本的平页CMS的用例
基本模型创建:
fromgitmodel.workspaceimportWorkspacefromgitmodelimportfieldsws=Workspace('path/to/my-repo/.git')classPage(ws.GitModel):slug=fields.SlugField()title=fields.CharField()content=fields.CharField()published=fields.BooleanField(default=True)
工作区可以看作是您的git工作目录。它还充当 “瓷”层到Pygit2的“管道”。与工作相反 目录,工作区类不使用存储库的索引和 头文件,而是在内存中跟踪这些
保存对象:
page=Page(slug='example-page',title='Example Page')page.content='<h2>Here is an Example</h2><p>Lorem Ipsum</p>'page.save()print(page.id)# abc99c394ab546dd9d6e3381f9c0fb4b
默认情况下,对象获取一个自动ID字段,该字段保存为python UUID hex (不要将这些与git散列混淆)。您可以轻松自定义 您的模型充当id字段,例如:
classPage(ws.GitModel):slug=fields.SlugField(id=True)# ORclassPage(ws.GitModel):slug=fields.SlugField()classMeta:id_field='slug'
默认情况下,对象不会提交到存储库不过,他们是, 作为树和blob写入对象数据库。Workspace.index 对象是保存未提交数据的pygit2.Tree这是安纳戈斯 git的索引,但指针存储在内存中。
创建提交很简单:
oid=page.save(commit=True,message='Added an example page')commit=ws.repo[oid]# a pygit2.Commit objectprint(commit.message)
您可以使用pygit2访问以前的提交,甚至可以查看两个提交之间的差异 对象的版本。
# walking commitsforcommitinws.walk():print("{}: {}".format(commit.hex,commit.message))# get a diff between two commitshead_commit=ws.branch.commitprev_commit_oid=head_commit.parents[0]print(prev_commit.diff(head_commit))
对象可以通过其id轻松检索:
page=Page.get('example-page')print(page.content)
警告清空器
git本身的性能不太好。如果需要git支持的数据 在生产环境中表现出色,你需要让它成为一个“僚机”。 由于python gitmodel可以以多种方式使用,因此 决定优化它的最佳方法。
状态
这个项目正在大力开发中,API可能会改变 在1.0发布之前。当前仅创建基本模型 保存实例也会起作用
待办事项
- 缓存? 标引?
- 查询API?
- 完整文档
python gitmodel的灵感来自Rick Olson的演讲,“Git, the Stupid NoSQL Database”和Paul Downman的GitModelfor ruby