Задать вопрос
Ответы пользователя по тегу SQLite
  • Как сделать условие в SQLite Python?

    Vindicar
    @Vindicar
    RTFM!
    Ну так у тебя второй запрос запршивает всех пользователей, без условия.
    А вообще приведённый код не имеет смысла и не должен работать вообще никак.
    for i in cursor.fetchone("SELECT ID FROM user_info WHERE RANK = '1'"):

    Ты перебираешь столбцы в первой строке (fetchone), для которой RANK = '1'. Это при том, что запрос возвращает тебе только один столбец - ID. А ещё метод fetchone() не принимает параметров. Ты пропустил вызов execute()?

    Потом ты почему-то берёшь 0й символ этого столбца. Если он равен 1 (а он не будет равен 1, так как это символ, а не число).
    Потом ты перебираешь всех пользователей, и отправляешь им сообщения (при этом у тебя в вызове send_message() две опечатки - в имени переменной и незакрытая скобка).

    А ещё у тебя отступы кривые - почему for i с отступом?

    В общем, по такой бредятине понять, в чём дело, нереально.
    Ответ написан
    4 комментария
  • Как решить проблему с SQLite3?

    Vindicar
    @Vindicar
    RTFM!
    С чего ты взял, что возвращаемое значение второй раз будет не None? Ты проверял, что данные заносятся?
    Собственно, в том и ошибка - у тебя уже есть запись с таким userid, второй раз вставить нельзя.

    А твоя GetInfo() не работает. Почему? Внезапно, в SQL сравнение - это =, а не ==. А ошибку тебе не пишет, потому что ты сделал except: pass. За такую практику вообще надо бить по пальцам линейкой, надеюсь, ты теперь понял почему.
    Ну и до кучи, если хочешь проверить существование, то лучше сделать запрос вида SELECT COUNT(*) FROM main WHERE user_id = ? или
    SELECT EXISTS(SELECT * FROM main WHERE user_id = ?)
    . Эти запросы гарантированно вернут одну строку с одним значением, 0 или 1. 0 - строка не существует, 1 - строка существует.
    Ответ написан
    1 комментарий
  • Стакаются ли sqlite и тг бот?

    Vindicar
    @Vindicar
    RTFM!
    1. Что значит "одновременного вноса"? sqlite не потокобезопасна, но если ты используешь асинхронную библиотеку для телеги с дефолтной реализацией event loop, то у тебя никогда не будут выполняться 2 обработчика одновременно. Дефолтная реализация строго однопоточна, и проблем с sqlite не будет.
    2. 500 человек - это не мера нагрузки. Самая примитивная мера нагрузки - обращений к базе в единицу времени.
    А вообще более точно было бы проводить измерение времени выполнения разных частей обработчика события. Если бот потребляет значительную долю ресурсов своего хостинга и при этом проводит много времени обращаясь к БД - вот тогда стоит задуматься о смене БД. И даже тогда можно сначала посмотреть в сторону aiosqlite, чтобы не тормозить всего бота, пока запрос к БД выполняется.
    Ответ написан
    Комментировать
  • TelegramBot + SQLite?

    Vindicar
    @Vindicar
    RTFM!
    Ну технически возможно: sqlite позволяет описывать user defined functions, которые можно вызывать внутри SQL-запросов - в том числе внутри триггеров. Вот только большой вопрос, что это за функции. С асинхронщиной могут быть проблемы.

    Но честно, я бы лучше сделал простой поллинг. Запросил все записи позднее заданного времени, если такие записи есть - обработал, заменил заданное время на самое позднее из этих записей. Повторять раз в пять минут.
    Да, время реакции медленнее, но зато код куда понятнее, и проще портируется на другую БД, если что.
    Ответ написан
    3 комментария
  • Как сделать вывод определённого количества столбцов?

    Vindicar
    @Vindicar
    RTFM!
    Читай про операторы LIMIT и OFFSET у SQL-запроса.
    Если размер страницы N записей, то для выдачи страницы i тебе нужно будет задать OFFSET (i - 1) * N LIMIT N.
    Разумеется, нужно также задать порядок сортировки записей через ORDER BY.
    Ответ написан
    Комментировать
  • Почему не записываются данные в бд?

    Vindicar
    @Vindicar
    RTFM!
    def user_exists(self, user_id):
        with self.connection:
            ...
    def add_user(self, user_id):
        with self.connection:


    По выходу из блока with соединение закроется. Второй блок with его уже не переоткроет.
    В таких ситуациях блок with использовать не надо.
    Ответ написан
    Комментировать
  • Наработает цикл for в цикле while что делать?

    Vindicar
    @Vindicar
    RTFM!
    Ну положим, в первом коде ты делаешь запрос с Num_bd = 0, а во втором ты начинаешь с Num_bd = 1 и так далее. У тебя в БД точно есть подходящие данные?
    Кроме того, else для for работает не так как ты думаешь. Ветка else отработает, если цикл for не был прерван оператором break.
    Ответ написан
  • Python SQLite как правильно сделать выборку?

    Vindicar
    @Vindicar
    RTFM!
    Хранишь отдельно строку запроса и отдельно список значений.
    Инициализируешь строку запроса SELECT * FROM table WHERE (1 = 1) - тогда у тебя будет корректный запрос и при наличии, и при отсутствии параметров.
    Затем для каждого параметра проверяешь, если он был передан - к строке запроса добавляешь f'AND ({paramname} = ?)' (где paramname это имя параметра), а в список значений добавляешь в конце значение этого параметра. Если не передан - не делаешь ничего.
    Тогда у тебя в конце будет строка вида
    SELECT * FROM table WHERE (1 = 1) AND (b = ?) AND (c = ?)
    , и к ней список значений, которые sqlite должна будет подставить вместо ?. Читай документацию на метод execute(), как это сделать.
    Ответ написан
    1 комментарий
  • Как вывести значения из базы данных без запятых скобок и т.д?

    Vindicar
    @Vindicar
    RTFM!
    fetchall() возвращает тебе список из кортежей.
    Если ты не знаешь, что это такое - бегом учить. Это абсолютно базовые структуры данных в питоне, для создания сколь-нибудь сложной программы с ними (+ещё словари) нужно уметь работать не задумываясь.
    Ответ написан
    Комментировать
  • Почему при подсчете количества строк в SQLite3 выводится не число, а 0x0000009E9DC70E30>?

    Vindicar
    @Vindicar
    RTFM!
    1. Ты получил объект-курсор. У него нет строкового представления, поэтому пр ивыводе он отображается по умолчанию - <Cursor object at адрес-объекта-в-памяти>
    Чтобы получить выбранные данные, нужно вызывать методы fetchone() или fetchall().
    2. Если ты делаешь запрос к БД, который возвращает данные (неважно какие), получить их придётся как описано выше. Что это за данные - сами строки, какая-то агрегатная функция, или еще что - не важно. Даже если выполнишь запрос вида SELECT 123;, всё равно результат придётся вытаскивать через fetchone()/fetchall().
    3. SUM(id) вернёт тебе сумму всех идентификаторов строк в таблице, а не количество строк в ней. Используй COUNT(*).
    Ответ написан
    Комментировать
  • Как работать с foreign key sqlite3 через python, нигде понятного объяснения не нашёл?

    Vindicar
    @Vindicar
    RTFM!
    Питон тут нипричем. Читаем доки по sqlite, находим пример:
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    CREATE TABLE track(
      trackid     INTEGER,
      trackname   TEXT, 
      trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE
    );

    Пример обеспечивает каскадное обновление ключа (ты вроде это просишь).
    Также может потребоваться включить поддержку внешних ключей, выполнив первым делом запрос:
    PRAGMA foreign_keys = ON;
    Ответ написан
    Комментировать
  • Пишу бота для телеграм (telebot), проблема с асинхронными функциями. В чем причина ошибки?

    Vindicar
    @Vindicar
    RTFM!
    1. await так не пишется.
    x = await asyncio.create_task(startq(message))
    2. Зачем ты делаешь await?
    asyncio.create_task() создаёт корутину, которая будет выполняться конкуррентно с текущей (как бы параллельно)
    await приостанавливает выполнение текущей корутины, пока не завершится вызываемая (справа от await).
    Т.е. await create_task(...) - это не очень осмысленно: сначала запускаешь параллельную корутину, а потом всё равно стоишь и ждёшь её.
    Если тебе нужно запустить корутину startq() и дождаться её выполнения (ну и получить возвращаемое значение) - пиши просто x = await startq(message)
    Если тебе нужно запустить корутину startq() и пусть она дальше выполняется сама по себе, тебе от неё ничего не надо - достаточно будет asyncio.create_task(startq(message))
    Ответ написан
    1 комментарий
  • Как добавить значение в базу данных?

    Vindicar
    @Vindicar
    RTFM!
    Я подозреваю, что создалась у тебя не таблица, а файл базы данных.
    Что бы создать таблицу, используй db.create_tables([Character])
    Ответ написан
    Комментировать
  • Пытаюсь сделать подсчет количество сообщений но не выходит discord.py?

    Vindicar
    @Vindicar
    RTFM!
    1. Запрос CREATE TABLE не нужно делать при каждом сообщении. Перенеси его в код, который вполняется при запуске бота.
    2. Не используй f-строки для формирования запросов. Почитай про подстановку параметров запроса.
    3. cur.execute() не вернёт тебе None или данные. Вызови метод fetchone(), чтобы получить одну строку данных, или None если данных нет.
    4. Если ты используешь sqlite, почитай про синтаксис INSERT ON CONFLICT DO UPDATE. Позволяет выполнить операцию в духе "создай запись, а если такая уже есть - обнови её", и тем самым свернуть твой if в один запрос. В других СУБД есть аналогичная возможность.
    Ответ написан
  • Как сделать, чтобы бот считывал кол-во втрок в БД и выводил в сообщении разное кол-во строк (в зависимости от кол-ва строчек в бд) на aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Скажи пожалуйста, как ты дошел до написания ботов, не зная, что такое конкатенация строк? >_<
    Любой из вариантов по ссылке можно применить к решению твоей задачи, это самые азы языка, черт побери.
    Ответ написан
    3 комментария
  • Почему sqlite3 не сохраняет запись?

    Vindicar
    @Vindicar
    RTFM!
    f'''INSERT INTO {table_name}(date, id, username)
                        VALUES('{date}', '{user_id}', '{username}')'''

    Вот почему бы не почитать хоть какой-нибудь туториал или официальную документацию(начиная со слов "SQL operations usually need to use values from Python variables")?
    Я понимаю динамическое имя таблицы (хотя это тоже сомнительный ход), но уж параметры-то можно вставлять по-человечески.

    А вообще, выбери что-то одно. Если ты осваиваешь SQL, не выделывайся с динамической генерацией запросов, освойся с простыми вещами для начала. Если нет - используй ORM, тот же peewee для начала, пусть он за тебя генерит запросы.

    Ну и до кучи, как ты проверяешь, что в базу ничего не добавляется?
    Ответ написан
    4 комментария
  • Как купить роль по "айди"?

    Vindicar
    @Vindicar
    RTFM!
    У тебя противоречия в запросах к БД. Для начала ответь на такие вопросы:
    1. Сколько серверов будет обслуживать бот - один или несколько?
    2. Сколько ролей можно покупать на сервере?
    3. Баланс пользователя будет свой на каждом сервере или общий?
    Исходя из этого и нужно проектировать БД.
    Ответ написан
  • Python Почему sqlite3 дублирует запрос?

    Vindicar
    @Vindicar
    RTFM!
    Если ту не установил первичный ключ для таблицы, в ней могут быть одинаковые записи.
    Ответ написан
  • Как правильно выбрать ячейку SQLite3?

    Vindicar
    @Vindicar
    RTFM!
    Про INSERT вам написали, а я добавлю. Никогда не составляйте запросы через форматирование строк, используйте подстановку параметров.
    Ответ написан
    Комментировать
  • Как вывести данные из базы данных с помощью Python?

    Vindicar
    @Vindicar
    RTFM!
    fetchall() возвращает список кортежей, это одна из базовых структур данных в питоне. Прочитай, что это такое, а потом уже берись за базы данных.
    Ответ написан
    2 комментария