Ответы пользователя по тегу SQLite
  • Почему присылает профиля всех хотя указанно where user_id?

    Vindicar
    @Vindicar
    RTFM!
    1. Потому что условие "WHERE {user_id}" будет истинным для любых ненулевых user_id. Тебе нужно условие WHERE id = {user_id} (предполагая, что колонка с id пользователя называется id).
    2. С поправкой на то, что это тебе на самом деле не нужно. НИКОГДА не создавай запросы через подстановку значения в строку, слишком легко ошибиться или поймать sql-инъекцию. Перепиши запрос на использование prepared statements.
    cursor.execute("SELECT money, biz, profitbiz, profitkaz, losemoneykaz, moneykaz FROM users WHERE id = ?", (user_id, ))
    Вместо каждого ? в запросе будет подставлен элемент из кортежа параметров. При этом движок сам позаботится о правильном экранировании.
    3. Переподключаться к БД каждый раз при вызове команды - плохая идея. Создай подключение при запуске бота и используй его. Максимум - создавай новый cursor для вызова команды.
    Ответ написан
    1 комментарий
  • Ошибка sqlite3.OperationalError: no such column: cash, как решить?

    Vindicar
    @Vindicar
    RTFM!
    А таблица уже существует в БД? Выведи-ка результат запроса к твоей БД:
    SELECT sql FROM sqlite_master WHERE name = 'users';
    Ответ написан
  • Что не так между кавычками: "sqlite3.OperationalError: near "̀": syntax error"? Учусь писать бота, по необходимости, но так ничего и не понял что там?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, если ты используешь синтаксис INSERT INTO table VALUES (...), то список значений должен в точности повторять список столбцов. У тебя порядок явно не совпадает. Используй синтаксис INSERT INTO table (столбец, столбец, ...) VALUES (значение, значение, ...), так проще контролировать правильность запроса.

    Во-вторых, никогда не формируй строку запроса с помощью форматирования строк! Это хороший способ заполучить SQL-инъекцию, Бобби Тейблз подтвердит. =) Используй плейсхолдеры (поищи строку "Never do this -- insecure!", и почитай рядом).
    Ответ написан
    3 комментария
  • Sqlite3.OperationalError: no such table: users?

    Vindicar
    @Vindicar
    RTFM!
    Засунь текст ошибки в гугл-транслейт, что ли...
    Он тебе английским по белому говорит, что таблица users не создана. Как mr_forlife объяснил, нужно создать таблицу через запрос вида CREATE TABLE. Ты создаёшь только login_id, но не users.
    Ответ написан
    2 комментария
  • No such column: id почему выхдает ошибку в discord.py ,sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, оформляй код, нечитаемо же. Кнопка </>.

    Во-вторых, у тебя запрос на создание таблицы имеет вид CREATE TABLE IF NOT EXISTS - то есть если таблица уже существует, этот запрос молча ничего не сделает. Обычно так и надо - но проблема в том, что если таблица существует, но имеет другой, неправильный набор столбцов, этот запрос всё равно молча ничего не сделает! Он проверяет только существование таблицы, но не её структуру.

    Вот поэтому Hemul GM и просит тебя показать структуру таблицы, как она есть в базе данных. Это можно сделать парой способов, например так.
    Напиши отдельный простой скрипт на питоне, который подключается к твоей базе и выполняет следующий запрос:
    SELECT sql FROM sqlite_master WHERE name = 'users';

    Сравни набор столбцов в этом запросе со своим запросом. Если столбцы не совпадают, значит, имеет место та ситуация, о которой я писал выше. Тогда тебе придётся или удалить таблицу(а может и всю базу) а потом создать её заново, уже как надо... или выполнить запрос ALTER TABLE, чтобы изменить набор столбцов в таблице.
    Первое гораздо проще, если ты ещё только разрабатываешь бота, и в базе не хранится ценной информации.
    Ответ написан
    6 комментариев
  • В чем ошибка sqlite python?

    Vindicar
    @Vindicar
    RTFM!
    img2 = open(f'{maxmark[2][0]}', 'rb')
                mime = magic.Magic(mime=True)
                filename = mime.from_file(maxmark[2])


    Строка один подразумевает, что имя файл - это maxmark[2][0]. Тогда maxmark[2] - это наверно, коллекция, кортеж, список или словарь, потому что я не думаю что вы открываете файл с именем из одного символа. К слову, зачем f'{maxmark[2][0]}'?
    Но в строке три судя по названию метода, нужно передать строку с путём к файлу файла - а передаётся туда maxmark[2], которое мы уже определили как возможный кортеж.
    Это совпадает с текстом ошибки.
    Ответ написан
  • Как прибавить +1 к значению в sqlite?

    Vindicar
    @Vindicar
    RTFM!
    > Сама ошибка - star = cursor.fetchone()[0]
    > TypeError: 'NoneType' object is not subscriptable

    not subscriptable означает что ты пытаешься взять индекс у объекта, который это не поддерживает. В твоем случае объект типа NoneType - т.е. None.
    Иными словами, cursor.fetchone() вернул None, и конечно у None нельзя взять индекс.
    Почему fetchone() вернул None? Потому что запрос SELECT не нашёл ни одной строки с подходящим значением photo!

    Как это решить?
    Вставить в таблицу строку с photo, а если не получится (так как такое photo уже есть), то обновить. Есть два способа.
    1. Кодом. Проверить, что вернул fetchone(). Если None, то делаем INSERT. Если не None, то UPDATE.
    2. Средствами БД, что обычно называется UPDATE/INSERT, или коротко UPSERT. Для sqlite это потребует примерно такого запроса:
    INSERT INTO stars (photo, star) VALUES (ид фото, 1) ON CONFLICT (photo) DO UPDATE SET star = star + 1

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

    ВАЖНО
    f'SELECT star FROM stars WHERE photo = "{photo}"' - никогда так не делайте! Особенно если входные данные получены от пользователя. Это хороший способ заполучить SQL-инъекцию.
    Используйте placeholders, по порядку:
    cursor.execute('SELECT star FROM stars WHERE photo = ?', (photo, ) )
    или по именам
    cursor.execute('SELECT star FROM stars WHERE photo = :photo', {'photo' : photo} )
    И удобнее и безопаснее.
    Ответ написан
    7 комментариев
  • Как запретить лайкать?

    Vindicar
    @Vindicar
    RTFM!
    База данных есть, я надеюсь?
    Лайк - это классическая связь многие-ко-многим между постами и юзерами.
    Т.е. помимо таблицы постов и таблицы юзеров делаешь связную таблицу из двух полей - id поста и id юзера. Если в ней есть запись - юзер лайкнул пост. Тогда можно
    а) проверять заранее, есть ли такая запись, и показывать "вы уже лайкнули"
    б) игнорировать повторные лайки, если они всё-таки придут. Просто сделай пару юзер-пост ключом
    в) как бонус - можно посчитать количество лайков посту и выбрать что лайкнул конкретный юзер.
    Ответ написан
    Комментировать
  • Как исправить ошибку discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, фигачить cursor.execute() прямо в f-строку - это очень, очень плохая идея. За такое бьют по пальцам.
    Во-вторых, not subscriptable означает, что ты пытаешься обратиться по индексу (типа x[0]) в то время как объект (x) - это None.
    90% шанс что это вызов .fetchone()[0] - запрос к базе не находит нужную строку, тогда fetchone() возвращает None, а дальше попытка получить индекс от None генерирует исключение.

    Никогда, НИКОГДА не пиши в f-строках выражение сложнее чем 2*2. Вынеси промежуточный результат в переменную, проверь её значение на корректность, затем уже используй.
    Ответ написан
    Комментировать