Давайте посмотрим, как мы можем хранить объекты Python, это включает строки, список, функцию и т. Д., Внутри дБ, как писсондб
Рассмотрим, что я функционирую Foo
который принимает аргумент х
и вернуть x * (x + x)
Отказ Который я хочу хранить внутри БД.
def foo(x: float) -> float: return x * (x + x)
Первые вещи сначала нам нужно преобразовать этот объект в байтовую строку. Для этого мы можем использовать соленый огурец
. модуль.
import pickle byte_string = pickle.dumps(foo)
Эта байтовая строка не может быть добавлена напрямую в базу данных Pysondb, поскольку строки байтов не являются json serializable. Таким образом, простой обходной путь будет добавлять цитаты вокруг строки байты, которую можно легко сделать так.
obj_string = f"{byte_string}"
Эта строка может быть добавлена в БД
from pysondb import db a = db.getDb("test.json") a.add({ "name": "foo_function", "obj": obj_string })
Чтобы получить объект назад, мы можем выполнить следующие шаги.
data = a.getBy({"name": "foo_function"})
Сейчас данные
будет выглядеть что-то вроде этого.
[{'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}]
Чтобы преобразовать строку OBJ обратно в Callable функцию. Мы можем сделать следующее.
str_obj = data[0]["obj"]
Помните, что str_obj
По-прежнему является строкой, а не байтовая строка, которая нам нужна, поскольку требуемая байтовая строка находится внутри этой строки, мы можем просто оценить строку.
import ast byte_obj = ast.literal_eval(str_obj)
Чтобы вызвать функцию, мы можем сделать это.
call_obj = pickle.loads(byte_obj) print(call_obj(3)) # output 18
Весь код
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))
Таким образом, мы успешно сохранили объект Python внутри БД. Шаги одинаковы для всех объектов, таких как список, либо Dict.
Оригинал: “https://dev.to/adwaithrajesh/storing-python-objects-in-pysondb-2f9m”