Какую базу данных нужно использовать для телеграмм бота?
Я создаю телеграмм-бота на python telebot с помощью базы данных Sqlite, направленный на покупку определённых товаров и я в этом новичок.
В самом боте уже есть корзина, которая отлично работает. Но есть очень важный нюанс.
Когда в первый раз запускаешь программу, то корзина работает без ошибок, то есть при добавления товара в корзину, этот же товар добавляется в базу данных, с удалением ситуация тоже правильная.
А вот на второй раз возникает проблема. Когда данные о пользователях сохраняются в БД, то при добавление товаров в корзину и удаление товаров из корзины, программа как бы делает корзину одного пользователя доступный для другого, и возникает такая ситуация: если у первого пользователя в корзине есть Товар 1 и Товар 2, и если у второго пользователя в корзине Товар 3, то первый пользователь получит возможность удалить Товар 3.
И я бы хотел узнать, может быть это как-то связано с базой данной, которую я использую?
Можно использовать хоть гугл таблицы, просто сделай поле, по которому будешь фильтровать записи и удалять. Можно взять телеграм айди, например и давать возможность удалять итд только при наличии у записи такой метки.
Иными словами, должно быть уникальное поле для каждого клиента, по которому нужно фильтровать
Chatbotist, именно такой логике я придерживаюсь.
У действительно создал такое уникальное поле, и по моей задумке, всё должно работать идеально, он всё равно что-то не то.
Я сейчас думаю над тем, как это исправить, и одна идея появилась. Если реализую её, то отпишусь.
Спасибо за советы!
Очень сложно дать конкретный совет не зная код или хотя бы структуру БД. По сути у вас должна быть проверка что именно этот пользователь имеет отступ к этим товарам, самый простой способ это чат айди (message.chat.id) это уникальный модификатор чата, и что этот айди имеет доступ к своей корзине.
guselnikov, Я могу описать как именно это происходит.
Когда пользователь нажимает кнопку Start, вызывается функция, которая проверяет, есть ли текущий ID пользователя в таблице. Если в таблице ID пользователя нет, то это значит, что он зашёл в бота впервые, значит, для него создаётся отдельная строчка с его данными.
Однако, если в таблице есть ID пользователя, то значит, что он зашёл в бота не в первый раз, а значит, у него есть своя уникальная корзина. Программа находит эту корзину и присваивает пустой корзине пользователя корзину из таблицы.
В общем как-то так.
Но у меня есть очень важный вопрос. Смотрите, я реализовывал товар и корзину через классы. То есть товары являются экземплярами класса Товар, а корзина является экземпляром класса Корзина. Так вот я думаю, что может в этом и ошибка. То есть из-за классов начинается путаница с товарами, а я об этом просто не знаю. Может быть, Вы знаете что-то на этот счёт?
Moskaa, если у вас для каждого клиента СВОЯ корзина и она НИ КАК НЕ ПЕРЕСЕКАЕТСЯ с другими картинами - таких проблем у вас быть не должно.
Насчет классов: а для чего иметь классы товаров и корзин? Товары как правило записаны в БД
Айди,название,описание,цена и все эти данные берутся из БД запросом который выполняется за мгновение.
guselnikov, а так можно?? Просто получается, что у меня товары не записаны в БД. У меня получается так, что БД берёт данные пользователе и товаре из кода. Просто как раз все перечисленные характеристики(кроме ID и цены) у меня есть в коде, а не в БД. А в БД у меня сохраняются данные о пользователе, взятые из кода.
Ну, как я понял, я что-то не так сделал, да?
С базой данных, как конкретным программным обеспечением, это не связано. Использовать можно любую реляционную базу. Проблема с кодом и, возможно, с тем как именно вы спроектировали вашу базу.
Скорее всего, но я просто не понимаю, где она, а присылать сюда, чтобы кто-то нашёл за меня ошибку и исправил её особо не хочется, тем более там 232 строки кода.
Может быть, Вы знаете какие-нибудь документации на этот счёт?
Moskaa, мог бы посоветовать создать интернет-магазин по учебным материалам. Думаю, что в процессе вы найдете решение вашей проблемы.
Еще можете связаться с авторами тех или иных учебных материалов. Думаю, есть вероятность, что из вежливости, они не откажутся провести вам код-ревью. По-крайней мере один раз.
Если вы хотите научиться, то с кодом лучше разобраться самостоятельно.
Для этого нужна отладка, желательно средствами какой-либо IDE, вы шаг за шагом проходите по своему коду, если вы сами писали код, то у вас должно быть понимание как он должен работать.
Если не осилили настройку отладки, можно покрыть код выводами в лог отладочной информации, это с одной стороны проще для реализации, с другой сложнее, так как перелопатить придется больше информации (хотя можно покрыть логированием только конкретный код)
С помощью отладки вы сможете найти место, где происходит не то что ожидается
rPman, если я Вас правильно понял, то вроде я делаю также, но я просто уже не понимаю, в какой части кода это делать, но я Вас услышал, постараюсь, спасибо.
jester-wizard, а у меня тут вопрос появился, а такая ошибка может случатся из-за того, что корзину и футболки я реализовал как классы, то есть у меня есть в проекте 1 корзина - это экземпляр класса Корзина - и 3 товара - это экземпляр класса Товары.
Может быть из-за этого у меня происходят такие недоразумения?
Ну тут есть вопрос от меня, как вы храните данные о пользовательских товарах?
У нас есть сущность пользователь 1, у него есть корзина(своя)
Есть сущность пользователь 2, у него есть корзина(своя)
Условно можем хранить idUser->array(productId)
Но это так. Домысли)
А вообще рекомендовали сделать интернет магазин выше, от себя порекомендую почитать про SQL, как это работает, что такое foreign key
Moskaa, Возможно, в какой-либо функции или где-то в самом классе есть значение по умолчанию в виде словаря или списка
Например: def __init__(self, cart=[]):
В таком случае словарь создаётся один раз и может изменяться внутри самой функции. В итоге, значение по умолчанию будет сохранять все изменения между вызовами функций.
По сути, словари и списки в питоне работают как указатели.
Использовать можно любую БД. То, что у вас проблема с корзиной товаров разных пользователей - это ошибка в логике вашего кода. Берёте бумажку, ручку и рисуете нужный алгоритм работы, прорабатываете его, делаете декомпозицию до самых простых элементов и исправляете в вашем приложении.
С БД не связано, связано с логикой работы приложения. следует сохранять не только данные в корзину но и ID пользователя. и давать управлять только данными этого пользователя.
Ratenti, в каждом телеграмм боте должен использоваться FSM, я сам сталкивался с такой проблемой, что у меня покупки пользователя уходили другому пользователю, благо тогда бот не был таким популярным и другие "приколы" были
setupx, странно, какие гайды я не смотрел, я впервые слышу такое. Но судя по тому, что это, как оно устроено и зачем оно, FSM действительно нужен, но он сложный ппц(
Почитай какие бывают связи (отношения) между таблицами в реляционных базах и подумай как тебе связать корзину, пользователя и товары. Наверняка можно нагуглить и готовые схемы-примеры.
Если Вам нужно решить проблему здесь и сейчас - Вы можете использовать ИИ. Отправляете код целиком в ChatGPT (нужен vpn для работы) или в DeepSeek. И описываете ему проблему так же как описали нам. После чего просите исправить код с пояснениями где исправлено и почему
Смотрите, я заранее создал БД с колонками с примерно теми же параметрами. Создал я её не в коде, а отдельно, однако всё равно не помогает(
Всё равно спасибо!