DEV Community

Cover image for Storing python objects inside PysonDB
Adwaith Rajesh
Adwaith Rajesh

Posted on

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.

Top comments (0)