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

Как исправить ошибку?

python библиотеки sqlite и telebot
python
import telebot, sqlite3
from telebot import types

conn = sqlite3.connect('users.db', check_same_thread=False)
cursor = conn.cursor()

# Создание таблицы trial

cursor.execute('''CREATE TABLE IF NOT EXISTS trial
                  (id INTEGER PRIMARY KEY, trialkey TEXT, trialactive INTEGER)''')
conn.commit()

# Создание таблицы users

cursor.execute('''CREATE TABLE IF NOT EXISTS users
                  (id INTEGER PRIMARY KEY, chat_id INTEGER, subscribed INTEGER, user_id INTEGER UNIQUE, username TEXT, torch INTEGER, trial INTEGER)''')
conn.commit()

@bot.message_handler(commands=['trial'])
def trial_handler(message):
  if list(cursor.execute(f'SELECT EXISTS (SELECT * FROM users WHERE trial = 1 AND chat_id = {message.chat.id})').fetchall()[0])[0] == 1:
    bot.send_message(message.chat.id, "Вам доступен бесплатный пробный период в 3 дня")

    cursor.execute('SELECT trialkey FROM trial WHERE trialactive = 1 LIMIT 1')
    results = cursor.fetchall()
    bot.send_message(message.chat.id, "Ваш ключ:")
    bot.send_message(message.chat.id, text = results)
    cursor.execute(f'UPDATE trial SET trialactive = 0 WHERE trialkey = {results}')
    conn.commit()

  
  else:
    bot.send_message(message.chat.id, "Вы использовали пробную версию.\n\nЕсли Вы желаете воспользоваться функциями VPN сервиса, оплатите подписку через ")


Ошибка:
File "c:\Users\user\OneDrive\Рабочий стол\testfuct\trial.py", line 76, in trial_handler
    cursor.execute(f'UPDATE trial SET trialactive = 0 WHERE trialkey = {results}')
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sqlite3.OperationalError: no such column: ('vless:-test',)
  • Вопрос задан
  • 59 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Everything_is_bad
Я очень зеленый в программировании, не знаю какой час сижу и разбираю одну ошибку.
ну почему ты даже доки не пытаетесь для начала почитать? https://docs.python.org/3/library/sqlite3.html#sql...
Ответ написан
Vindicar
@Vindicar
RTFM!
Объясняю на пальцах:
UPDATE trial SET trialactive = 0 WHERE trialkey = 'vless:-test'
- обновить запись, где столбец trialkey равен строке "vless:-test"
UPDATE trial SET trialactive = 0 WHERE trialkey = vless:-test
- обновить запись, где столбец trialkey равен столбцу vless:-test, а такого столбца у тебя нет.

А причина - потому что ты не озаботился как следует посмотреть примеры работы с БД в питоне, и сразу побежал херачить текст запроса с помощью f-строк, хотя каждый первый туториал предупреждает что так делать нельзя, а нужно использовать placeholder'ы.

Ссылку на https://docs.python.org/3/library/sqlite3.html#sql... тебе выше дали, разобрать её несложно.
Первый пример кода (который помечен # Never do this -- insecure!) допускает ту же самую ошибку, что и твоё
cursor.execute(f'UPDATE trial SET trialactive = 0 WHERE trialkey = {results}')
и другие запросы.
А второй пример кода показывает, как правильно.
# This is the qmark style used in a SELECT query:
params = (1972,)
cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)

Т.е. ставишь знак вопроса там, где нужно вставить значение, а потом вторым параметром передаёшь кортеж вставляемых значений - столько, сколько у тебя знаков вопроса в запросе.
Ответ написан
Комментировать
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Ваш ответ на вопрос

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

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