Задать вопрос
Ответы пользователя по тегу SQLite
  • Как записать в sql информацию через метод WHERE?

    Vindicar
    @Vindicar
    RTFM!
    INSERT не предполагает WHERE, так как создаёт новую запись в таблице.
    Если тебе нужно обновить существующую запись, используй UPDATE.
    Ответ написан
    Комментировать
  • Поиск списка в базе данных, как осуществить?

    Vindicar
    @Vindicar
    RTFM!
    sqlite поддерживает оператор IN, можешь попробовать использовать его. Но это подойдёт только для точных совпадений.
    Ответ написан
  • Как брать данные из бд по очереди sqlite?

    Vindicar
    @Vindicar
    RTFM!
    Хранить для каждого пользователя состояние - какие фильтры выставлены, какая позиция в списке была просмотрена последней.
    Чтобы выбирать данные из БД начиная с этой позиции, отсортируй данные и используй OFFSET и LIMIT. Гарантии того, что какие-то новые элементы не будут пропущены, это не даст, но зато очень простая реализация. Хранишь для пользователя OFFSET, а про нажатии "дальше" увеличиваешь его на LIMIT.
    Ответ написан
  • Здравствуйте. Как правильно написать функцию для определения типа данных при создании таблицы в sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала не пытаться засунуть запрос в одну f-строку, а собирать его по частям. Нечитаемо же. И зачем тебе @staticmethod, если это не часть класса? А если часть класса, то почему staticmethod, а не classmethod - ты же обращаешься к константе data_type, которая должна быть в том же классе, не?
    А вообще, у меня такое чувство что ты пытаешься сделать свою ORM. Попробуй погоняй ponyorm или peewee, они простые и удобные.
    Ответ написан
    Комментировать
  • Python sqlite как обновить запись в базе?

    Vindicar
    @Vindicar
    RTFM!
    Убери кавычки вокруг последнего "?". В текущем варианте ты обновляешь баланс пользователя с именем "?", т.е. подстановка из переменной не происходит.
    И да, как посоветовали выше - проверь, что у тебя в переменных money и user перед запросом.
    print('Money:', repr(money))
    print('User:', repr(user))
    repr() выведет строку как строковую константу в питоне, т.е. можно будет увидеть обычно невидимые символы, которые могут присутствовать. Например, пробелы в конце строки.
    Ответ написан
    Комментировать
  • Как отправлять по очереди данные заказа по команде "Дальше" из БД Sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Ответ очевиден. Тебе нужно для пользователя хранить, на какой позиции он остановился, и продолжать оттуда.
    Простой способ - использовать модификаторы OFFSET и LIMIT в SQL запросе. Тогда достаточно будет хранить просто число, которое будет использоваться в OFFSET. При начальном запросе это число ставить в 0, а по нажатию дальше - увеличивать на значение LIMIT.

    Технически это можно оформить таблицей БД с парами "id пользователя - число".
    Ответ написан
    1 комментарий
  • Почему присылает профиля всех хотя указанно 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. Вынеси промежуточный результат в переменную, проверь её значение на корректность, затем уже используй.
    Ответ написан
    Комментировать