Storing python objects inside PysonDB

adwaithrajesh

Adwaith Rajesh

Posted on June 13, 2021

Storing python objects inside PysonDB

Let's see how we can store python objects, this include strings, list, function, etc.., inside a DB like pysonDB

Consider I've function foo which takes an argument x and return x * (x + x). Which I want to store inside a DB.

def foo(x: float) -> float:
    return x * (x + x)
Enter fullscreen mode Exit fullscreen mode

First things first we nee to convert this object to byte string. To do that we can use the pickle. module.

import pickle
byte_string = pickle.dumps(foo)
Enter fullscreen mode Exit fullscreen mode

This byte string cannot be directly added to a PysonDB database, as byte strings are not JSON serializable. So a simple workaround will be to add quotes around the byte string which can be easily done like this.

obj_string = f"{byte_string}"
Enter fullscreen mode Exit fullscreen mode

This string can be now added to the DB

from pysondb import db

a = db.getDb("test.json")
a.add({
    "name": "foo_function",
    "obj": obj_string
})
Enter fullscreen mode Exit fullscreen mode

To get the object back we can do the following steps.

data = a.getBy({"name": "foo_function"})
Enter fullscreen mode Exit fullscreen mode

Now data will look something like this.

[{'name': 'foo_function', 'obj': "b'\\x80\\x04\\x95\\x14\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x08__main__\\x94\\x8c\\x03foo\\x94\\x93\\x94.'", 'id': 316182400052721056}]
Enter fullscreen mode Exit fullscreen mode

To convert the obj string back to a callable function. We can do the following.

str_obj = data[0]["obj"]
Enter fullscreen mode Exit fullscreen mode

Remember that str_obj is still a string and not a byte string, which is what we need, since the required byte string is inside this string, we can simply evaluate the string.

import ast
byte_obj = ast.literal_eval(str_obj) 
Enter fullscreen mode Exit fullscreen mode

To call the function we can do this.

call_obj = pickle.loads(byte_obj)
print(call_obj(3))

# output
18
Enter fullscreen mode Exit fullscreen mode

Entire Code

import ast
import pickle

from pysondb import db

def foo(x: float) -> float:
    return x * (x + x)

byte_string = pickle.dumps(foo)
obj_string = f"{byte_string}"

a = db.getDb("test2.json")
a.add({
    "name": "foo_function",
    "obj": obj_string
})

data = a.getBy({"name": "foo_function"})

str_obj = data[0]["obj"]
byte_obj = ast.literal_eval(str_obj)

call_obj = pickle.loads(byte_obj)
print(call_obj(3))

Enter fullscreen mode Exit fullscreen mode

So we have successfully stored a python object inside a DB. The steps are the same for all the objects like list or dict.

💖 💪 🙅 🚩
adwaithrajesh
Adwaith Rajesh

Posted on June 13, 2021

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related