Задать вопрос
Ответы пользователя по тегу SQLite
  • Нужна помощь с sqlite3, discord.py?

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

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

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

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

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

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

    Думаю, остальное сможешь додумать сам.
    Ответ написан
    5 комментариев
  • Как удалить данные из таблицы pysqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Когда ты делаешь with self.connection, ты создаёшь транзакцию БД - т.е. связный набор операций, которые будут либо все вместе применены, либо все вместе отвергнуты. Так как у тебя только одна операция каждый раз, это не имеет смысла.
    А вот курсор у тебя используется один и тот же, вне транзакции. Это не дело. Лучше создавай его заново внутри метода.
    Ответ написан
  • Как синхронизировать БД sqlite и виджет tkinter ttk.treeview?

    Vindicar
    @Vindicar
    RTFM!
    Питоновский модуль для sqlite этого не умеет, хотя sqlite сама по себе предоставляет update_hook. См stackoverflow.
    Более простое решение - периодически опрашивать сервер, но это может быть напряжно.

    Но с учетом твоего другого вопроса, PostgreSQL реализует синтаксис LISTEN/NOTIFY. Есть модули для питона, которые позволяют этим пользоваться. Периодический опрос всё ещё потребуется, но он будет потреблять куда меньше ресурсов, чем SELECT.
    Ответ написан
    Комментировать
  • Как синхронизировать два файла базы данных sqlite в приложении на python?

    Vindicar
    @Vindicar
    RTFM!
    Сделать нормальный сервер БД вместо SQLite. Возьми MariaDB, или Postgre, или что угодно.

    Потому что иначе всё равно придётся разрешать конфликты записей. Например, в таблице X один пользователь добавил запись A с id=10, а другой независимо добавил запись B с id=10. Придётся одну перенумеровывать. А если у них ещё и связанные записи в других таблицах?
    Ответ написан
    Комментировать
  • Как сделать вывод данных из базы данных в переменную python?

    Vindicar
    @Vindicar
    RTFM!
    В дополнение к написанному выше @Dr. Bacon, можно сделать так
    connect.row_factory = sqlite3.Row
    Тогда вместо простых кортежей будут возвращаться объекты, похожие на словари, и можно будет обращаться к полям по имени.
    cursor.execute("""SELECT OrderNumber FROM orders ORDER BY OrderNumber DESC LIMIT 1;""")
    row = cursor.fetchone()
    ID = row['OrderNumber']

    Единственное, смена row_factory затронет только курсоры, созданные позднее. Созданные ранее курсоры будут использовать предыдущую фабрику строк. Так что если хочешь это сделать, менять row_factory лучше сразу после открытия соединения.
    Ответ написан
    Комментировать
  • Питон не видит таблицу Sqlite, что делать?

    Vindicar
    @Vindicar
    RTFM!
    по видеоуроку ХаудиХо

    Ну собственно проблема уже в этом. Эти видяшки почти ничего не объясняют, а просто "делай как я". Нужно как следует учить язык, боты - не самая тривиальная вещь.

    А вообще galaxy выше прав. Вы указываете базу данных вот так: sqlite3.connect("Database.db")
    Если не помните, это то, что называется "относительный путь", который отсчитывается относительно текущего рабочего каталога. Проблема в том, что текущий рабочий каталог при запуске скрипта может быть разным - это совершенно необязательно каталог, где лежит скрипт (хотя часто может им быть). Факторов, влияющих на текущий рабочий каталог, очень много, и лучше на него не полагаться.
    Надежнее узнать полный путь до каталога скрипта, и использовать его для построения пути до рабочих файлов скрипта. Например, так:
    import sys
    import pathlib
    script_path = pathlib.Path(sys.argv[0]).parent  # абсолютный путь до каталога, где лежит скрипт
    conn = sqlite3.connect(script_path / "Database.db")  # формируем абсолютный путь до файла базы

    Вот после этого можно быть уверенным, к какой базе обращается бот.
    Ответ написан
  • Почему в .exe файле программы (Pyqt5) не исполняются команды к sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    > Таблица это сама есть, базу данных я перебросил в корень с исполняемым файлом.
    Т.е. ты не пытаешься запаковать БД, так?
    А ты уверен, что скрипт её находит? Указываешь полный путь до файла с БД? Или как всегда, относительный, и авось текущая рабочая директория будет правильной?
    Просто некоторые py -> exe упаковщики при запуске экзешника распаковывают скрипт во временный каталог, и работают оттуда... а тогда файл БД окажется не рядом со скриптом. Не помню, делает ли так py2exe, выясни.
    Ответ написан
    7 комментариев
  • Как реализовать поиск в sqlite на python?

    Vindicar
    @Vindicar
    RTFM!
    Это называется "нечеткий поиск", и это непростая тема. Как говорится в одном анекдоте, "длина, ширина, высота и глубина - это совсем не то же, что длинка, ширинка, высотка и глубинка".
    Ответ написан
    6 комментариев
  • VALUES(?) как работает в Sqlite3/Python?

    Vindicar
    @Vindicar
    RTFM!
    1. VALUES - это часть синтаксиса SQL, точнее запроса INSERT, а не питоновской обертки sqlite3. Твой запрос синтаксически некорректен. Обёртка позволяет только заменить токен ? на переданное значение.
    2. Насколько я знаю, нельзя, так как подстановка значений умеет вставлять только константы - числа и строки. Можно (только осторожно) использовать обычное форматирование строк. Но вообще если ты наткнулся на такую задачу, стоит остановиться и переспросить себя: нельзя ли добиться того же самого результата по-другому? Потому что в динамическом формировании SQL запросов легко напортачить.
    Ответ написан
    Комментировать
  • Проблема со вставкой аргументов в sql запрос python, в чем причина?

    Vindicar
    @Vindicar
    RTFM!
    Ни в коем случае не делайте так
    cur.execute("""INSERT INTO commands (user_id, date, command_name) VALUES (7 , {} , 'd')""".format(time_now))

    Поймаете SQL injection, да и косяков со строками тоже будет немеряно. На один вы уже наткнулись.
    Правильно будет так:
    cur.execute("INSERT INTO commands (user_id, date, command_name) VALUES (7 , ?, 'd')", (time_now,))

    В этом случае передаваемый аргумент будет правильно экранирован, завернут в кавычки и пр.
    Это написано в начале документации по модулю sqlite3, но ведь документацию читают только лузеры. правда же?
    Ответ написан
    1 комментарий
  • Как сделать tasks.loop автоматического разбана после истечения времени, используя SQLITE3?

    Vindicar
    @Vindicar
    RTFM!
    зачем вызов await client.wait_until_ready() в цикле for bans в функции ban_loop()? Это затормозит цикл чёрт знает насколько. Аналогично с вызовом того же в начале ban_loop() - у тебя же есть обработчик on_ready(), ты запускаешь ban_loop() там, это гарантирует, что цикл начнётся когда бот уже готов работать.

    Далее, зачем выбирать все баны и пролистывать их, когда можно настроить SELECT чтобы он выбирал только истёкшие баны?
    Ответ написан
    3 комментария
  • Как изменить последний столбец в sqlite python?

    Vindicar
    @Vindicar
    RTFM!
    > Дело в том что у меня несколько строк с одним и тем же ключом
    Значит, у тебя нет первичного ключа в таблице, так как первичный ключ должен быть уникален.
    Исправляй структуру таблицы, чтобы был действительно уникальный ключ, тогда и проблем таких не будет.
    Ответ написан
    2 комментария
  • Как создать базу данных sqlite3 для всех серверов на которые есть бот discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Не проще ли включить id сервера в соответствующие таблицы?
    Т.е. у каждого пользователя будет составной id: свой id + id сервера. Аналогично с ссылками на этого пользователя.
    Потому что создавать отдельную БД на каждый сервер довольно муторно - и не очень ясно, какая от этого выгода.
    Ответ написан
    1 комментарий
  • Как считывать данные из базы данных в sqlite с помощью python?

    Vindicar
    @Vindicar
    RTFM!
    Потому что нужно читать документацию, там на первой же паре страниц есть примеры кода, в том числе запрос SELECT.

    Что ты вообще ожидаешь получить вызовом str(cursor.execute), если ты знаешь, что cursor.execute() - это метод?
    И почему ты игнорируешь возвращаемое им значение, когда выполняешь запрос?

    Короче, ещё раз - читай доки. Они полезные.
    for row in cursor.execute('SELECT bdname FROM user_city'):
            print(row)
    Ответ написан
    Комментировать
  • Как правильно список загрузить в базу данных MySQL через Python?

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

    Vindicar
    @Vindicar
    RTFM!
    Грубо говоря, для асинхронной программы верно одно утверждение: "пока ты выполняешь код, не являющийся await вызовом, остальная программа простаивает".
    Каждый await вызов (а также его завершение) - это повод переключиться на другую задачу.
    Таким образом, бесконечный цикл - это просто:
    while True:
      await asyncio.sleep(5) #пока текущая корутина спит, остальной бот работает
      do_stuff() #пока do_stuff() работает, остальной бот спит

    Вопрос в другом: нужен ли бесконечный цикл?
    Я бы посоветовал начать с создания системы сбора статистики.
    Например, завести таблицу вида id юзера - имя статы - значение статы.
    Скажем "id - число_сообщений - 100500". И в обработчиках соответствующих событий делать UPDATE на эту таблицу. А потом в отдельном модуле периодически проверять статы пользователей, проверять, есть ли у них уже ачивка за эту стату, и если нет - то давать.
    Ответ написан