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 годиков, так что не судите строго