Как сохранять состояние пользователя телеграм бота?
Пишу Telegram бота на Python в учебных целях без использования сторонних библиотек. Бот реализует словарные карточки для изучения иностранного языка. Алгоритм работы: есть набор из 100 слов, бот одновременно тренирует 10 слов из набора до тех пор, пока пользователь не по пометит какое-нибудь слово выученным, затем это слово удаляется из тренируемых и добавляется новое из оставшихся 90. Вопрос: как реализовать возможность использования бота несколькими юзерами? Думаю подключить SQlite базу данных и записывать состояние после каждого изменения. Но изменения могут быть слишком частыми и читать придется базу при каждом взаимодействии с пользователем. Не слишком ли это накладно для производительности бота?
Иван, вопрос стоит не столько в выборе СУБД, сколько в самом подходе решения проемы. Это мой первый учебный проект, поэтому я даже не знаю в правильном ли направлении мыслю.
YuriyCherniy, в правильном. Вам в любом случае необходимо хранить состояние для каждого пользователя. Если пользователей планируется очень много, то хранить однозначно в БД.
что ненормального в sqlite? Для такой задачи как раз и нужна sqlite.
Единожды открыть файл и читать с задержкой почти равной латентности диска гораздо лучше, чем подключить Postgres и сначала сформировать пакет, потом подождать пока операционка сматчит буферы дальше распарсить его на стороне СУБД, потом сделать все тоже самое что делает sqlite и еще ждать отправки в другую сторону.
И это мы говорим о том что postgress находится на одном хосте с ботом.
Если говорить что-то о скорости, то у sqlite есть no-sync режим когда у тебя после первого чтения данные хранятся в оперативе, и синхронизируются с файлом только по команде.
Для учебного проекта идеально ибо оперативы на всех точно хватит, скорости сколько хочешь, и если что-то пойдет не так - это лишь учебный проект. Ты все равно не переживаешь за потерянные данные.
Но есть варик еще проще.
Просто хранить текстовики или json-файлы в определенной папочке с названиями равными tg_id юзеров и со всей необходимой инфой на каждого внутри. Тогда даже все еще без доп либ обойтись получится. А по скорости будет почти как sql без no-sync режима, но это можно компенсировать храня во время основной работы данные в хэшмапе и выгружая в файлы по необходимости
Возьмите обыкновенные txt файлы. В один будет записываться база юзеров, и один принадлежит каждому юзеру, где хранится текущее состояние его. При каждом запросе проверяйте есть ли юзер в первом файле, если есть то идет проверка какое сейчас состояние. В БД всегда можно будет потом все перенести, чтобы сейчас не тратить кучу времени на изучение.
Работа с SQlite показалась очень даже не сложной. По крайней мере на уровне CREATE, INSERT, UPDATE, чего для моих задач пока хватит. Но за совет спасибо.