Ответы пользователя по тегу SQLite
  • Наработает цикл for в цикле while что делать?

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

    Vindicar
    @Vindicar
    Хранишь отдельно строку запроса и отдельно список значений.
    Инициализируешь строку запроса 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
    fetchall() возвращает тебе список из кортежей.
    Если ты не знаешь, что это такое - бегом учить. Это абсолютно базовые структуры данных в питоне, для создания сколь-нибудь сложной программы с ними (+ещё словари) нужно уметь работать не задумываясь.
    Ответ написан
    Комментировать
  • Ошибка sqlite3.OperationalError: no such table: users Как исправить?

    Vindicar
    @Vindicar
    conn = sqlite3.connect('database.db')
            self.connection = sqlite3.connect(db_file)

    Как задаёшь db_file? Тоже как 'чтототам.db'? Тогда все шансы что ты споткнулся на относительных путях.

    Относительный путь вычисляется НЕ относительно каталога, содержащего скрипт, а относительно текущего рабочего каталога. Который
    • может зависеть от способа запуска скрипта
    • может меняться в ходе его работы
    • может совпадать или не совпадать с каталогом, где лежит скрипт

    Иными словами, твоя админка для БД смотрит на один файл, а скрипт - на другой. И в этом другом никаких таблиц, конечно, не создано.

    Поэтому при доступе к файлам данных лучше явно конструировать абсолютный путь до них.
    import sqlite3
    import sys
    import pathlib
    
    script_dir = pathlib.Path(sys.argv[0]).parent
    db_file = script_dir / 'database.db'
    conn = sqlite3.connect(db_file)
    Ответ написан
    Комментировать
  • Почему при подсчете количества строк в SQLite3 выводится не число, а 0x0000009E9DC70E30>?

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

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

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

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

    Vindicar
    @Vindicar
    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 комментария
  • Discord.py, как купить роль по "айди"?

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

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

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

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

    Vindicar
    @Vindicar
    В коде неправильного больше чем правильного...
    1. У тебя написано, что команда должна получить два параметра - text и id. Если id она должна найти сама, то его нужно убрать из параметров купить(). id нужно получить из ctx.author.id.
    2. Ты вообще пробовал обращаться к своей базе? Смотрел, что тебе возвращает fetchone()?
    По твоему запросу она вернёт либо кортеж с одним значением, либо None, если не было найдено ни одной подходящей строки.
    Ни то ни другое сравнивать непосредственно нельзя!
    Вытащи результат в переменные, проверь на None, а потом уже сравнивай нулевые элементы.
    3. Убери токен бота из тела вопроса.
    4. Советую cursor создавать внутри обработчика, во избежание заморочек с одновременным использованием.
    5. Советую указывать типы параметров в описании команды! discord.py обращает на них внимание, и пытается конвертировать входную строку.
    async def купить(ctx, text: str):
    6. Как уже было написано, execute() принимает вторым параметром КОРТЕЖ, пусть даже из одного элемента. А кортеж из одного элемента пишется как (item,).
    Ответ написан
  • Что значит check_same_thread? В Python sqlite3?

    Vindicar
    @Vindicar
    sqlite3 не потоко-безопасна - если ты одновременно обращаешься к базе из нескольких потоков, это может запороть базу.
    Соответственно, по умолчанию библиотека проверяет, что подключение к базе используется тем же потоком, который создал этот подключение - т.е. что оно ограничено рамками одного потока. Если это не так, выбрасывается исключение. Это поведение по умолчанию, чтобы новички потом не плакались "почему у меня иногда база портится?!!"

    Но если ты очень осторожен и не допускаешь одновременных запросов (с помощью синхронизации по мьютексу. например), то можно безопасно использовать одно подключение из нескольких потоков. Тогда можно сказать sqlite "не дергайся насчёт потоков, я знаю что делаю". Вот эту возможность (подавить проверку) и предоставляет параметр check_same_thread = False.
    Ответ написан
    Комментировать
  • UnboundLocalError: local variable 'metawallet' referenced before assignment. Что делать?

    Vindicar
    @Vindicar
    Если в result нет ни одной строки, какое значение будет у metawallet?
    Ответ написан
  • Как решить данную проблему с SQLite?

    Vindicar
    @Vindicar
    for row in result:
        singup = str(row[0])

    Молчаливо подразумевает, что в result будет хотя бы одна строка. Это далеко не факт.
    Если result пуст, то singup не будет присвоено значение.
    Ответ написан
    Комментировать
  • Как реализовать систему изменения данных в базе данных?

    Vindicar
    @Vindicar
    Ну во-первых, если ты используешь aiogram, то про многопоточность лучше забыть. Асинхронность с многопоточностью сочетается довольно плохо. Это возможно, но нетривиально, и новичкам лучше не связываться.
    Во-вторых, дай угадаю - задержку в цикле фарминга реализуешь через time.sleep()? Если да, то конечно, цикл асинхронной программы останавливается на это время. Вот почему предусмотрена функция asyncio.sleep(), которая может приостановить выполнение отдельной корутины, не трогая остальных.
    В-третьих, если тебе нужно выполнить корутину и дождаться результата её выполнения - используй оператор await. Если же тебе нужно запланировать выполнение корутины и идти дальше, не дожидаясь её результата (выполнение "как только, так сразу") - лучше использовать asyncio.get_event_loop().create_task().

    Думаю, остальное сможешь додумать сам.
    Ответ написан
    5 комментариев