JSON База данных на Python

0e59deffc803b9813b371b3e34a42081

Приветствую!

Я хочу вам рассказать о моей разработке — JSON БД на Python

Не все проекты нуждаются в медленных и сложных SQL базах данных, например ТГ‑Боты и парсеры. Конечно не буду спорить, что SQL — вероятно лучшее решение для бизнеса, но иногда они могут быть избыточными для небольших проектов. NoSQL базы данных — это отличный выбор для таких случаев.

Если вы уже знакомы с MongoDB или Redis, то принцип работы моей библиотеки вам будет понятен.

Ну что, начнём?

Основы

from jsoner import Database

# инициализация объекта БД
db = Database('db.json')

 # добавление данных
db.add('key', 'value')

# получение
db.get('key') # 'value'

# запись изменений в файл
db.commit()

# изменение значения
db.update('key', 100)

# увеличение значения на 5
db.incr(key, 5)

# уменьшение значения на 15
db.decr(key, 15)

# удаление
db.delete('key')

Теги

Теги создаются путем добавления словаря из пар Тег: значение

from jsoner import Database
from jsoner.tags import const_tag
from jsoner.errors import ValueIsConstant

db = Database('db.json', autocommit=True)

# тег неизменяемого значения
db.add('pi', 3.14, {const_tag: True})

try:
    db.update('pi', 4)
except ValueIsConstant:
     print('Ключ "pi" - константа')

>>> 'Ключ "pi" - константа'

Теги и их значения записываются в словарь tags

db.json

{
    "__settings__": {
        "__version__": "0.1", 
        "default": null,
        "tags": {
            "pi": {
                "const": true
            }
        }, 
        "global_tags": {}
    },
    "pi": 3.14
}

Создание своих тегов

С помощью класса NewTag можно создавать свои теги

from jsoner import Database
from jsoner.tags import NewTag

db = Database('db.json')

class MyTag(NewTag):

    # создании тега, метод должен вернуть преобразованный аргумент тега
    def create(db: Database, value, tag_arg):
        return tag_arg

    # изменение значения
    def update(db: Database, key: str, old_value, new_value, tag_arg):
        return new_value

    # чтение значения
    def read(db: Database, key: str, value, tag_arg):
        return value

Пример создания своего тега

from jsoner import Database
from jsoner.tags import NewTag
import time

class ttl_tag(NewTag):
    'Time to life - время жизни ключа'

    def create(db: Database, value, tag_arg) -> str:

        # tag_arg в данном случае - время действия ключа
        # в аргументе тега сохранится время, до которого действителен ключ
        
        return tag_arg + time.time()

    def read(db: Database, key, value, tag_arg):

        # если текущее время больше аргумента тега, ключ следует удалить, и вернуть значение по умолчанию
        
        if time.time() <= tag_arg:
            return value
        else:
            db.delete(key)
            return db.data[db.settings]['default'] # тут хранится значение по умолчанию

Установка значения по умолчанию

from jsoner import Database

db = Database('data.json')

# установка значения по умолчанию
db.set_default(0)

print(db.get('Unknown key'))
>>> 0

Добавление глобальных тегов

Глобальные теги действительны и одинаковы для всех ключей

from jsoner import Database
from jsoner.tags import const_tag
from jsoner.errors import ValueIsConstant

db = Database('data.json')

# добавление глобального тега
db.set_global_tag(const_tag, True)

db.add('num', 123)
db.update('num', 0)
>>> raise ValueIsConstant

Работа с оператором with

При входе в оператор with вызывается метод db.discard(), который стирает несохраненные в файл данные

Если атрибут autocommit у db равен True, то он заменится на False, а при выходе из with вернется обратно

При выходе из with вызывается метод db.commit()

from jsoner import Database

db = Database('data.json')

db.add('num', 0)

with db:
    db.add('key', 'value')

print(db.items())
>>> [('key', 'value')]

Другие полезные методы

  • discard — стереть несохраненные в файле данные

  • get_many — получить несколько значений по ключам

  • set — автоматически либо добавляет, либо изменяет данные. Т. к. при добавлении существующего ключа или обновлении несуществующего вызовется исключение

  • keys, values, items — схожи с методами из обычных словарей

  • db['key'] = 'value' — установить значение

  • db['key'] — прочитать значение

Полное описание и код можете увидеть на моём гитхабе

Послесловие

Приму конструктивную критику в свой адрес, но дяденьки-программисты, хочу вам сказать, что мне 15 годиков, так что не судите строго

© Habrahabr.ru