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

от автора

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

Я хочу вам рассказать о моей разработке — 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 годиков, так что не судите строго


ссылка на оригинал статьи https://habr.com/ru/articles/834108/