Задать вопрос
WolfInChains
@WolfInChains

Как правильно сделать проверку sqlite?

После первого варна перестает работать. Я немного менял chek_user_warn и пробовал использовать
if chek_user_warn(event.obj.reply_message['from_id']) ==  1:
, тогда доходило до 2, но когда участнику 3 варн прописывал, то его считало за 2. И еще как правильно увеличить число варнов в таблице на 1, пробовал традиционными методами, чот не работало, ну либо я рукожоп.
if event.object.text == "Варн" or event.object.text == "варн":
    if event.obj.from_id in get_admins(event.obj.peer_id):
        if not is_user_warned(event.obj.reply_message['from_id']):
            insert_warnlist(event.obj.reply_message['from_id'])
            add_warn(event.obj.reply_message['from_id'])
            send_msg(event.obj.peer_id, "✅Пользователь получил 1/3 варнов")
        else:
            if chek_user_warn(event.obj.reply_message['from_id'], 1):
                add_warn(event.obj.reply_message['from_id'])
                send_msg(event.obj.peer_id, "✅Пользователь получил 2/3 варнов")
            if chek_user_warn(event.obj.reply_message['from_id'], 2):
                add_warn(event.obj.reply_message['from_id'])
                send_msg(event.obj.peer_id, "✅Пользователь получил 3/3 варнов")
                kick_user_fwd()


def is_user_warned(user_id: int) -> bool:
    cmd = "select count(user_id) from warnlist where user_id = %d" % (user_id)
    c.execute(cmd)
    result = c.fetchone()[0]
    print("Проверка айди на наличие в базе")
    return result > 0


def insert_warnlist(user_id: int):
    cmd = "INSERT INTO warnlist(user_id) VALUES (%d)" % (user_id)
    c.execute(cmd)
    conn.commit()
    print("Пользователь добавлен в варнлист")


def delete_warnlist(user_id: int):
    cmd = "DELETE FROM warnlist WHERE user_id=%d" % user_id
    c.execute(cmd)
    conn.commit()
    print("Пользователь удален из варнлиста")


def add_warn(user_id: int):
    cmd = "UPDATE warnlist SET warns = +1 WHERE user_id=%d" % user_id
    c.execute(cmd)
    conn.commit()
    print("Пользователь получил +1 варн")


def chek_user_warn(user_id: int, warns: int):
    cmd = "select count(warns) from warnlist where (user_id = %d, warns = %s)" % (user_id, warns)
    c.execute(cmd)
    result = c.fetchone()[0]
    print("Проверка варнов пользователя")
    return result > 0
  • Вопрос задан
  • 82 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
WolfInChains
@WolfInChains Автор вопроса
посмотрел пример и понял в чем ошибка
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
shabelski89
@shabelski89
engineer
В Вашем случае при вызове каждой из функций не хватает открытия соединения с БД.
with sqlite3.connect('my.db') as connection:
    cursor = connection.cursor()
    cursor.execute(cmd)

Я уже приводил пример взаимодействия тут, чтобы минимизировать дублирование кода.

Далее используются непонятные проверки и преобразования:
def is_user_warned(user_id: int) -> bool:
в коде выше используется проверка, если вернулось True то делай, то
if not is_user_warned(event.obj.reply_message['from_id']):

не обязательно явно возвращать return result > 0, если result не пустой, то и будет True.
возвращайте значение, с которым потом можно работать, и что не помешает сделать при этом проверку на пустоту.
def post_sql_query(sql_query):
    with sqlite3.connect('my.db') as connection:
        cursor = connection.cursor()
        try:
            cursor.execute(sql_query)
        except Error:
            pass
        result = cursor.fetchall()
        return result


def is_user_warned(user_id: int):
    cmd = "select count(user_id) from warnlist where user_id = %d" % (user_id)
    result  = post_sql_query(cmd)
    return result


if not is_user_warned(event.obj.reply_message['from_id']):
    print('добавить')
else:
    print('+ 1/3 варн')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы