Ответы пользователя по тегу SQLite
  • Что лучше вытаскивать данные из БД(sqlite) или хранить в неких переменных?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Что лучше вытаскивать данные из БД(sqlite) или хранить в неких переменных?
    Если данные критичные и недопустима их потеря - хранить в БД, если допустимо их потерять из-за ошибок, отключений и прочего - хранить в переменных. Если и то и то, накапливать какое-то количество данных и скидывать в БД сразу батчем по таймеру или по достижению определенного размера.

    async def on_message(self, message: Message): ...
    on_message это событие, которое срабатывает на каждое сообщение, каждого пользователя. На среднего размера боте с несколькими сотнями серверов в активное вечернее время оно может дергаться тысячи раз в секунду, как сами думаете, насколько адекватно в таком событии ходить в базу? Насколько часто меняются каналы, чтобы каждый раз их доставать из БД? Знаешь ли условия, при которых данные в базе меняются и их нужно повторно перечитать?

    guild_id = message.guild.id
    Как думаете, что лежит в guild, если боту пишут в личные сообщения?

    Либо включайте голову и думайте почему вы делаете то или иное действие: нужны ли вам данные на чтение или на запись, могут ли они одновременно измениться, обрабатываются ли корнер кейсы и прочее или пишите как пишется, оптимизацией займетесь если дойдете до того, что она понадобится.

    Подскажите, как лучше для оптимизации процессов, и где можно на будущие брать полезную информацию о python.
    Читать книги, слушать подкасты, ходить на конференции.
    Ответ написан
    Комментировать
  • Пишу бота на telebo + sql, с sql кака то ошибка,не понимаю в чем ошиька, поможете?

    fenrir1121
    @fenrir1121
    Начни с документации
    sqlite3.OperationalError: no such column: telegram_id
    Помочь с переводом ошибки? В таблице нет колонки telegram_id.

    С учетом того, что у тебя таблица создается с правилом IF NOT EXISTS вероятно ранее уже создана таблица без этой колонки. Добавить первичный ключ в существующую таблицу можно только при помощи определенных танцев с бубном, вероятно стоит удалить таблицу и создать заново.
    Ответ написан
    Комментировать
  • Как сделать временный бан в Disnake с базой данных SQLite?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    1) Записать в БД время, когда нужно разбанить и id пользователя
    2) Сделать обычный бан
    3) Периодически (скажем раз в минуту) ходить в базу и доставать записи для которых время разбана меньше текущего времени
    4) Выполнить разбан всех полученных id, удалить записи из БД

    sqlite не имеет встроенного формата для дат и времени, так что я бы рекомендовал хранить время как INT, преобразуя datetime в timestamp.
    Ответ написан
    Комментировать
  • Почему появляется ошибка «“)” syntax error»?

    fenrir1121
    @fenrir1121
    Начни с документации
    Потому что нужно читать ошибку, а затем число открывающих и закрывающих скобок, если за вас это не делает IDE.
    И не используйте f строки в sql запросах, на эту тему есть множество ответов.
    Ответ написан
    2 комментария
  • Почему заносит одного пользователя несколько раз?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Потому что cursor.fetchone() is None всегда будет False.
    Ответ написан
  • Не работает условие Python, SQLite как решить и почему?

    fenrir1121
    @fenrir1121
    Начни с документации
    chat_verification = {message.chat.id}
    check = cursor.execute(f"SELECT chat_id FROM chat_id_table WHERE chat_id ='{chat_verification}' AND verification = 1

    Вооружайтесь принтами и смотрите что вы наговнокодили в этих двух строчках.
    Примерно каждый второй вопрос в SQLite сводится к ответу не используйте f строки в SQL запросах
    И вы вообще осознаете какой тип данных у chat_verification?

    В целом если 10 строчек кода требуют двух вопросов на хабре берите за привычку разбираться какими данными и типами данных вы манипулируете. Не работает - запускаете отладчик или принтуете и смотрите соответствуют ли данные и типы данных вашим ожиданиям.
    Ответ написан
  • Проблема с внесением данных участника сервера discord в базу данных sqlite3, что делать?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Минимально изучите sql чтобы помощь не была бесполезна и приведите код к приемлемому виду.
    Вероятнее всего после исправления и вопрос отпадет.

    0. Никогда не используйте f-строки, format() и % в sql запросах. Прочитайте хотя бы базовую документацию sqlite3. Прочитайте про первичный ключ, внешний ключ, значения по-умолчанию. Посмотрите какие есть типы данных и какие у них ограничения. К примеру ваш id не влезет в INT
    1. Удалите весь кошмар из on_ready. Никогда не прогоняйте всех пользователей всех серверов. А тем более при каждом запуске. Зачем хранить десятки(сотни, тысячи, миллионы) людей в базе, судя по всему это магазин, вот и добавляйте профиль в момент когда человек начинает им пользоваться
    2. Вместо подобной конструкции из if -select - insert используйте INSERT INTO ... ON CONFLICT ... DO UPDATE SET ...

    ...
    99. Больше не копируйте там, откуда вы это скопировали
    Ответ написан
    Комментировать
  • Как сделать два администратора в /admins?

    fenrir1121
    @fenrir1121
    Начни с документации
    Ответ на конкретный вопрос как убрать какие-то символы - посмотрите документацию по replace(), translate(), join() и что такое срез строк.

    Ответ на реальный вопрос, который вы не смогли сформулировать: не использовать список для admins, когда нужна просто строка и не делать SELECT *, когда нужен только ID
    Ответ написан
    2 комментария
  • Как разделить БД дискорд бота под разные сервера?

    fenrir1121
    @fenrir1121
    Начни с документации
    В таблицу добавить ключевое поле GUILD_ID
    Соответственно запрос изменится на:
    select = '''SELECT * FROM "users" WHERE id = %s AND guild_id = %s'''
    cur.execute(select, (member.id, guild.id))
    Ответ написан
    Комментировать