/tinydb-git

A storage backend for tinydb that stores database changes inside a git

Primary LanguagePythonMIT LicenseMIT

tinydb-git

A storage backend for tinydb that stores database changes inside a git branch.

tinydb-git lets you use any branch in a git repository as a backend for tinydb.

hiro@wintermute:tmp$ git init example
Initialized empty Git repository in /tmp/example/.git/

Every modification of the database results in a new commit:

>>> import tinydb
>>> from tinydb_git.json import JSONGitStorage
>>> db = tinydb.TinyDB('example', storage=JSONGitStorage)
>>> db.insert({'text': 'first record'})
1
hiro@wintermute:example$ git log
commit de9a07844783b8e420fce6f9568e126dd7779e74

    Updated by tinydb-git 0.1.dev1

commit 3b31825cf312cb5d42f792998faddf20b634c7d9

    Updated by tinydb-git 0.1.dev1

Multiple insert() calls result in a commit for each call. This can be avoided by using a tinyrecord transaction:

>>> from tinyrecord import transaction
>>> with transaction(db.table('_default')) as t:
...         t.insert({'b': 2})
...         t.insert({'c': 3})
...         t.insert({'d': 4})
...
>>>

The result:

hiro@wintermute:example$ git log
commit e02a3af06d7cd7eeb6990277777cc24d384249e8

    Updated by tinydb-git 0.1.dev1

commit de9a07844783b8e420fce6f9568e126dd7779e74

    Updated by tinydb-git 0.1.dev1

commit 3b31825cf312cb5d42f792998faddf20b634c7d9

    Updated by tinydb-git 0.1.dev1

Internally, data gets stored as json, with sort_keys=True and indent=2, to make diffs pleasant to read and help with compression:

hiro@wintermute:example$ git diff master^ master
diff --git a/tinydb.json b/tinydb.json
index a27ff44..d9711f0 100644
--- a/tinydb.json
+++ b/tinydb.json
@@ -2,6 +2,15 @@
   "_default": {
     "1": {
       "text": "first record"
+    },
+    "2": {
+      "b": 2
+    },
+    "3": {
+      "c": 3
+    },
+    "4": {
+      "d": 4
     }
   }
 }
\ No newline at end of file