Приветствую!
Я хочу вам рассказать о моей разработке — 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/
Добавить комментарий