Рубрики
Без рубрики

Хранение объектов Python внутри Pysondb

Давайте посмотрим, как мы можем хранить объекты Python, это включает в себя строки, список, функцию и т. Д., Внутри БД … Теги с Python, базой данных, объектами.

Давайте посмотрим, как мы можем хранить объекты 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”