Flata is a lightweight document orientated database, which was inspired by TinyDB and LowDB .
Why Flata?
Most of the times my mind gets in its curious states and I think about alternative ways on doing things, especially testing lightweight apps and today I wondered if theres any NoSQL-like software out there that is easy to spin up and is backed by a flat file, something like sqlite
for SQL-like services, so this time just something for NoSQL-like.
So I stumbled upon TinyDB and Flata which is really easy to use and awesome!
What will we be doing today:
Create Database / Table
Write to the Table
Update Documents from the Table
Scan the Table
Query the Table
Delete Documents from the Table
Purge the Table
Getting the Dependencies:
Flata is written in Python, so no external dependencies is needed. To install it:
Usage Examples:
My home working directory:
This will be the directory where we will save our database in .json
format.
Import the Dependencies:
1
2
>>> from flata import Flata , Query , where
>>> from flata.storages import JSONStorage
Create the Database file where all the data will be persisted:
1
>>> db_init = Flata ( 'mydb.json' , storage = JSONStorage )
Create the collection / table, with a custom id field. If the resource already exists a retrieve will be done:
1
>>> db_init . table ( 'collection1' , id_field = 'uid' )
List the tables:
1
2
>>> db_init . all ()
{ u'collection1' : {}}
a get method can only be done if the resource exists, and we will assign it to the db
object:
1
>>> db = db_init . get ( 'collection1' )
Insert some data into our table:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> db . insert ({ 'username' : 'ruanb' , 'name' : 'ruan' , 'age' : 31 , 'gender' : 'male' , 'location' : 'south africa' })
{ 'username' : 'ruanb' , 'uid' : 1 , 'gender' : 'male' , 'age' : 31 , 'location' : 'south africa' , 'name' : 'ruan' }
>>> db . insert ({ 'username' : 'stefanb' , 'name' : 'stefan' , 'age' : 30 , 'gender' : 'male' , 'location' : 'south africa' })
{ 'username' : 'stefanb' , 'uid' : 2 , 'gender' : 'male' , 'age' : 30 , 'location' : 'south africa' , 'name' : 'stefan' }
>>> db . insert ({ 'username' : 'mikec' , 'name' : 'mike' , 'age' : 28 , 'gender' : 'male' , 'location' : 'south africa' })
{ 'username' : 'mikec' , 'uid' : 3 , 'gender' : 'male' , 'age' : 28 , 'location' : 'south africa' , 'name' : 'mike' }
>>> db . insert ({ 'username' : 'sam' , 'name' : 'samantha' , 'age' : 24 , 'gender' : 'female' , 'location' : 'south africa' })
{ 'username' : 'sam' , 'uid' : 4 , 'gender' : 'female' , 'age' : 24 , 'location' : 'south africa' , 'name' : 'samantha' }
>>> db . insert ({ 'username' : 'michellek' , 'name' : 'michelle' , 'age' : 32 , 'gender' : 'female' , 'location' : 'south africa' })
{ 'username' : 'michellek' , 'uid' : 5 , 'gender' : 'female' , 'age' : 32 , 'location' : 'south africa' , 'name' : 'michelle' }
Scan the whole table:
1
2
>>> db . all ()
[{ u'username' : u'ruanb' , u'uid' : 1 , u'name' : u'ruan' , u'gender' : u'male' , u'age' : 31 , u'location' : u'south africa' }, { u'username' : u'stefanb' , u'uid' : 2 , u'name' : u'stefan' , u'gender' : u'male' , u'age' : 30 , u'location' : u'south africa' }, { u'username' : u'mikec' , u'uid' : 3 , u'name' : u'mike' , u'gender' : u'male' , u'age' : 28 , u'location' : u'south africa' }, { u'username' : u'sam' , u'uid' : 4 , u'name' : u'samantha' , u'gender' : u'female' , u'age' : 24 , u'location' : u'south africa' }, { u'username' : u'michellek' , u'uid' : 5 , u'name' : u'michelle' , u'gender' : u'female' , u'age' : 32 , u'location' : u'south africa' }]
Query data from the table.
Query the table for the username => ruanb
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> import json
>>> q = Query ()
>>> response = db . search ( q . username == 'ruanb' )
>>> print ( json . dumps ( response , indent = 2 ))
[
{
u'username' : u'ruanb' ,
u'uid' : 1 ,
u'name' : u'ruan' ,
u'gender' : u'male' ,
u'age' : 31 ,
u'location' : u'south africa'
}
]
Query the table for everyone that is older than 29
and only male
genders:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> db . search (( q . gender == 'male' ) & ( q . age >= 29 ))
[
{
u'username' : u'ruanb' ,
u'uid' : 1 ,
u'name' : u'ruan' ,
u'gender' : u'male' ,
u'age' : 31 ,
u'location' : u'south africa'
},
{
u'username' : u'stefanb' ,
u'uid' : 2 ,
u'name' : u'stefan' ,
u'gender' : u'male' ,
u'age' : 30 ,
u'location' : u'south africa'
}
]
Query the table for everyone that is younger than 25 or males:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
>>> db . search (( q . age < 25 ) | ( q . gender == 'male' ) )
[
{
"username" : "ruanb" ,
"uid" : 1 ,
"name" : "ruan" ,
"gender" : "male" ,
"age" : 31 ,
"location" : "south africa"
},
{
"username" : "stefanb" ,
"uid" : 2 ,
"name" : "stefan" ,
"gender" : "male" ,
"age" : 30 ,
"location" : "south africa"
},
{
"username" : "mikec" ,
"uid" : 3 ,
"name" : "mike" ,
"gender" : "male" ,
"age" : 28 ,
"location" : "south africa"
},
{
"username" : "sam" ,
"uid" : 4 ,
"name" : "samantha" ,
"gender" : "female" ,
"age" : 24 ,
"location" : "south africa"
}
]
Update the location value: Lets say Samantha relocated to New Zealand, and we need to update her location from South Africa
to New Zealand
:
1
2
3
4
5
>>> db . update ({ 'location' : 'new zealand' }, where ( 'username' ) == 'sam' )
([ 4 ], [{ u'username' : u'sam' , u'uid' : 4 , u'name' : u'samantha' , u'gender' : u'female' , u'age' : 24 , u'location' : 'new zealand' }])
>>> db . search ( q . username == 'sam' )
[{ u'username' : u'sam' , u'uid' : 4 , u'name' : u'samantha' , u'gender' : u'female' , u'age' : 24 , u'location' : u'new zealand' }]
Delete a document by its id:
1
2
>>> db . remove ( ids = [ 4 ])
([ 4 ], [])
Delete all documents matching a query, for this example, all people with the gender: male
:
1
2
>>> db . remove ( q . gender == 'male' )
([ 1 , 2 , 3 ], [])
Delete all the data in the table:
When we exit, you will find the database file, which we created:
Resources: