Задать вопрос
Ответы пользователя по тегу SQLite
  • Как выводить данные из БД SQlite в боте aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Сначала создай курсор, потом на нём уже вызывай execute() для выполнения запросов. Когда закончишь работать с курсором - вызови close(). Это часть спецификации DB-API 2.0, которому следует большинство библиотек для работы с БД на питоне.
    Ответ написан
    Комментировать
  • Почему данные в БД SQlite добавляются в новую строку?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты выполняешь два запроса INSERT. Запрос INSERT добавляет новую строку. Всё логично.
    Тебе нужно сделать одно из двух:
    Вариант 1. Изменить код так, чтобы бот накапливал сведения в памяти, и только на самом последнем этапе заносить собранное в БД. Я вижу, ты используешь FSM - отлично! Этот механизм позволяет хранить произвольные данные в контексте состояния.
    Вариант 2. Сделать, как сделал Pasha выше - вносишь первую порцию данных через INSERT, остальные - через UPDATE. Тогда у тебя на последующих этапах будут обновляться существующая строка.
    Можно сделать, как предложил fenrir - использовать UPSERT, который сводится к "если строки нет, делай INSERT, если есть, делай UPDATE", но я бы не советовал его тут использовать - лучше сначала чётко разобраться, что и как работает.

    Разница между вариантами будет в ситуации, когда бот отвалился в процессе регистрации. В первом случае собранные частичные данные будут забыты, и пользователю придётся регаться с начала. Во втором случае у тебя в базе будет недореганный пользователь, что может "всплыть" (спровоцировать ошибки) в дальнейшем. Так что я бы предпочёл вариант 1.

    В любом случае, поддерживаю замечание насчёт первичного ключа - это основное понятие! Пойми, что это такое, и задай его для своей таблицы.
    Ответ написан
    1 комментарий
  • Долгая обработка SQL запроса?

    Vindicar
    @Vindicar
    RTFM!
    Какое лютое извращение.
    user_parsing_ok = cur.fetchall()
        korteg = ()
        for k in user_parsing_ok:
            korteg += k
            step += 1

    Во-первых, вы вытаскиваете 3 миллиона записей в память как питоновские объекты. Это не очень хорошая идея.
    Во-вторых, вместо того, чтобы по-человечески сделать
    korteg = tuple(item[0] for item in user_parsing_ok)
    вы делаете конкатенацию кортежей по одному. Напомню, что при конкатенации создаётся новый кортеж - так что при добавлении трёхмиллионного элемента у вас в памяти будет один кортеж с 2999999 элементами и один кортеж с 3000000 элементами. Это дело будет люто, бешено, неиллюзорно жрать память, а значит, свопиться на диск. Что не прибавит скорости.
    Как написали выше, просто используйте подзапрос. Вам совершенно незачем таскать эти айдишники из БД в питон, а потом из питона в БД. Пусть они обрабатываются только в рамках БД.
    Ответ написан
    Комментировать
  • Хочу сделать проверку: есть ли канал на сервере или нет в функции для добавления его в БД?

    Vindicar
    @Vindicar
    RTFM!
    Если бот находится на этом сервере, то просто запрашиваешь канал через bot.get_channel() и потому уже проверяешь channel.guild.id на полученном канале.
    Если бота на сервере нет, то я без понятия, возможно ли получить информацию о сервере. Я бы предположил что нет.
    Ответ написан
  • Почему не работает база данных sqlite3 для телеграм бота?

    Vindicar
    @Vindicar
    RTFM!
    cursor.executemany('''
            INSERT INTO bugs (bug_name, bug_info, developer) VALUES (?, ?, ?)
        ''', (bug_name_var, bug_info_var, developer))


    Почему тут executemany()? Ты вызываешь его, как будто это простой execute().
    Ответ написан
    Комментировать
  • Телеграм бот перестает работать, пишет ошибка в базе данных. Где ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Включи голову и подумай.
    Судя по ошибке, у тебя в таблице users ID пользователя - уникальный ключ.
    Запрос на создание таблицы у тебя не содержит указания ключа, что, к слову, нехорошо. Я полагаю, ты убрал запись о ключе в какой-то момент, но не пересоздал таблицу.
    Ты записываешь в эту таблицу данные о пользователе всякий раз, когда получаешь команду /start.
    Внимание, вопрос: что произойдёт, если пользователь введёт /start ещё раз?
    Прааааавильно, бот попытается создать ещё одну запись для этого пользователя. Что запрещено наличием первичного ключа.

    Для начала ответь себе на вопрос: что тебе нужно сделать в базе, если пользователь ввёл /start ещё раз?
    Ничего? Читай про форму INSERT OR IGNORE, она как раз позволяет молча пропустить запись, если такой первичный ключ уже есть.
    Сообщить пользователю? Тогда сначала проверь в базе наличие записи для этого пользователя, и если она есть - сообщай, если её нет, то вноси в базу.
    Ответ написан
    Комментировать
  • Flask вывод изображения из базы данных?

    Vindicar
    @Vindicar
    RTFM!
    А зачем ты делаешь data:? Не проще сделать <img src="/photo" />?
    Ну и да, ты говоришь, что у тебя есть переменная encoded_image - а где она? Ты не делаешь base64 кодирование, хотя и заявляешь, что делаешь.
    Ответ написан
    3 комментария
  • Какова верная реализация множественного выбора в SQLite через LIKE и REGEXP (Python)?

    Vindicar
    @Vindicar
    RTFM!
    заглавные буквы идут в кодовых таблицах подряд. По идее, будет достаточно что-то типа:
    WHERE substr(word, 1, 1) BETWEEN 'A' AND 'Z'
    если таблица word меняется нечасто, добавь в неё отдельный столбец, содержащий первую букву, и сделай индекс по нему. Может значительно ускорить дело.
    Ответ написан
    1 комментарий
  • Ошибка в sqlite3 telebot?

    Vindicar
    @Vindicar
    RTFM!
    Выучить питон ДО того, как бросаться писать ботов, а не после.
    def summa (message: int) -> int:
        msg = bot.send_message(message.chat.id, 'Введите сумму перевода:')
        bot.register_next_step_handler(msg, perevod)


    Ты заявляешь, что функция возвращает int, и используешь её, как будто она возвращает int, но она ничего не возвращает - а раз так, она возвращает None.

    Ну и да, читай примеры из документации, как правильно использовать register_next_step_handler().

    sqlite тут вообще не при делах, но я замечу: не используй f-строки для формирования запросов. Вот, INSERT ты вроде правильно делаешь, так в чём проблема везде делать так же?
    Ответ написан
    Комментировать
  • При добавлении пользователя в таблицу в поле ID ставиться none, хотя я сделал проверку, пользователю присваивается ID. Что не так?

    Vindicar
    @Vindicar
    RTFM!
    Ты эту БД давно используешь? Просто новички часто споыткаются о простой факт. Запросы вида CREATE TABLE IF NOT EXISTS создадут отсутствующую таблицу, но не изменят таблицу, если она уже существует. Даже если структура таблицы отличается от заданной. Скажем, если ты добавил автоинкремент в запрос CREATE позднее, то в реальной таблице его не будет.
    В таком случае проще всего снести файл базы, чтобы она пересоздалась, и снова наполнить его данными.

    Также можешь попробовать узнать реальную структуру твоей таблицы так:
    SELECT sql FROM sqlite_schema WHERE type = 'table' AND name = 'customers'
    Ответ написан
    Комментировать
  • Как реализовать перенос строки MarkdownV2?

    Vindicar
    @Vindicar
    RTFM!
    https://www.markdownguide.org/basic-syntax/#line-breaks
    To create a line break or new line (<br>), end a line with two or more spaces, and then type return.

    Попробуй два пробела перед переносом строки, т.е. ' \n'
    Ответ написан
    Комментировать
  • Как можно исправить странную ошибку в коде python?

    Vindicar
    @Vindicar
    RTFM!
    description(400)
    это что?

    EDIT: а не, SQLite такое позволяет. У тебя ошибка в другом месте:
    category_id INTEGER NO NULL
    "NOT NULL", а не "NO NULL"
    Ответ написан
  • Как произвести сортировку в таблице SQLite3, после удаления записи?

    Vindicar
    @Vindicar
    RTFM!
    Ты просто не понимаешь сути первичного ключа.
    Это значение, которое однозначно идентифицирует строку, независимо от наличия и количества других строк в таблице. И точка. Он не должен меняться вообще за время жизни строки.
    Бывают случаи, когда у нас уже есть уникальное значение, которое можно использовать как ключ.
    Но куда чаще используются синтетические ключи, т.е. просто числа, которые пользователь по-хорошему и видеть-то не должен никогда. А раз так, то какая разница, есть ли дырки в нумерации?
    Я больше скажу, иногда сплошная нумерация - это слабое место в системе.
    Ответ написан
    Комментировать
  • В чем заключается ошибка и как ее исправить?

    Vindicar
    @Vindicar
    RTFM!
    Дополню ответ Сергей Горностаев
    cursor2.execute("SELECT sneakers_model FROM user_inventory WHERE sneakers_model = ?", (random_sneakers[0]))

    А надо
    cursor2.execute("SELECT sneakers_model FROM user_inventory WHERE sneakers_model = ?", (random_sneakers[0],))

    Без запятой у тебя просто строка передаётся, и поэтому функция каждый символ считает за отдельное значение. Вот и получается 17 символов в строке = 17 значений, а место одно.
    С запятой ты передаёшь кортеж из одной строки. Одна строка - одно место.
    Ответ написан
    Комментировать
  • Sqlite3, OperationalError: unable to open database file, как обойти эту ошибку?

    Vindicar
    @Vindicar
    RTFM!
    Путь к файлу у тебя относительный, т.е. он будет зависеть от текущего рабочего каталога. А тот, в свою очередь, зависит от того, как ты запускаешь скрипт, и может меняться в ходе работы скрипта.
    Так что если нужен путь именно относительно скрипта, используй pathlib.
    from pathlib import Path
    from sys import argv
    
    script_dir = Path(argv[0]).parent.resolve()  # путь к каталогу скрипта
    db_path = script_dir / 'basa' / 'users.db'  # путь к файлу в подкаталоге
    Ответ написан
    1 комментарий
  • Как правильно сделать вывод данных из sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Category ID пробелы в именах столбцов - не лучшая идея. У тебя точно толбец так называется? Если да, то оберни имя столбца в `бэктики` (обычно на клавише Ё).
    Ну и да, сдаётся мне, что 'call.data' не будет работать так, как ты это ожидаешь.
    Ответ написан
    Комментировать
  • Как вывести сообщения пользователя в бд?

    Vindicar
    @Vindicar
    RTFM!
    @dp.callback_query_handler(text='1')
    async def id1(callback: CallbackQuery):

    Этот обработчик прикреплён к кнопкам в сообщении /start. Поэтому callback.message указывает именно на это сообщение.
    А тебе нужно дождаться следующего сообщения. Читай про finite state machine.
    Ответ написан
    Комментировать
  • Как отправить sql запрос к базе данных на вывод даты регистрации пользователя?

    Vindicar
    @Vindicar
    RTFM!
    SELECT user_id, join_date EXTRACT(DAY FROM date) as day FROM users VALUES (?, ?)

    SELECT запросы c условием пишутся не так.
    Ответ написан
    Комментировать
  • Как принимать только уникальных пользователей?

    Vindicar
    @Vindicar
    RTFM!
    CREATE TABLE IF NOT EXISTS accounts (
                    id INTEGER PRIMARY KEY AUTOINCREMENT, 
                    users_name TEXT, 
                    acc_id INTEGER
    )

    Doplis01, ну вот и результат. Если у тебя УЖЕ ЕСТЬ уникальное для каждого пользователя целое число acc_id (естественный ключ), зачем ты добавил синтетический ключ id? Просто переделай таблицу, выкинь id, сделай acc_id PRIMARY_KEY без автоинкремента.
    Ответ написан
    2 комментария
  • Почему выводится ошибка и как ее исправить Sqlite3 Disnake?

    Vindicar
    @Vindicar
    RTFM!
    Запомни простую вещь: никогда, никогда не формируй SQL-запросы форматированием строк. Ни f-строками, ни методом format(), ни %-форматированием. Ты сейчас на своей шкуре почувствовал, почему этого не стоит делать.
    И читай документаци, там написано как правильно. Более того, есть отдельный раздел как раз об этом. RTFM!
    Ответ написан
    Комментировать