sqlite3 выдает ошибку об отсутствии колонки

import telebot
import sqlite3

#bot

bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands = ['start'])
def start(message):
    user_id = message.from_user.id
    user_niсkname = message.from_user.username

    add_new_user(user_id, user_niсkname)

def add_new_user(user_id, user_niсkname):
    connect = sqlite3.connect('users.db')
    cursor = connect.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS users_inf(
        id INTEGER,
        niсkname TEXT,
        warnings_on_real_moment INTEGER
    );""")

    connect.commit()

    #chek id
    cursor.execute(f'SELECT id FROM users_inf WHERE id = {user_id}')
    data = cursor.fetchone()
    if data is None:

        #add values in table

        cursor.execute("""INSERT INTO users_inf(id, niсkname, warnings_on_real_moment) 
            VALUES(user_id, user_niсkname, 0);""")
        connect.commit()
        
        print('У нас новый пользователь его id: ' + str(user_id) + ' Также его ник: ' + str(user_niсkname))
    else:
        bot.send_message(message.chat.id, 'Ты что пытаешься сделать?\n Ты уже есть в базе!')

bot.polling()

ошибка:

File "D:\Python projects\проект школа\проект.py", line 14, in start
    add_new_user(user_id, user_niсkname)
  File "D:\Python projects\проект школа\проект.py", line 35, in add_new_user
    cursor.execute("""INSERT INTO users_inf(id, niсkname, warnings_on_real_moment)
sqlite3.OperationalError: no such column: user_id

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

Заранее спасибо


Ответы (1 шт):

Автор решения: KoVadim

Когда Вы выполняете вот такое

cursor.execute(f'SELECT id FROM users_inf WHERE id = {user_id}')

питон вначале вместо фигурных скобок с текстом внутри подставляет значение и получается, что на самом деле базе прилетит вот где то такое

cursor.execute('SELECT id FROM users_inf WHERE id = 10')

и база знает, что с таким делать.

когда же Вы пишете так

cursor.execute("""INSERT INTO users_inf(id, niсkname, warnings_on_real_moment) 
VALUES(user_id, user_niсkname, 0);""")

то базе прилетает вот такое

INSERT INTO users_inf(id, niсkname, warnings_on_real_moment) 
VALUES(user_id, user_niсkname, 0);

база смотрит на это и думает, а что такое в качестве значений (VALUES) мне передали. Это не числа, оно не в кавычках, значит это другой столбец. А их нет...

Что же делать? Подставить реальные значения, например, воспользовавшись теми же f строками.

cursor.execute(f'INSERT INTO users_inf(id, niсkname, warnings_on_real_moment) 
        VALUES({user_id}, {user_niсkname}, 0);')

но лучше так не делать - представьте себе, что user_nickname содержит кучу странных символов (как в этом комиксе - https://xkcd.com/327/).

Что делать? воспользоваться ORM (Которых много-много) или просто написать, как предложили в комментарии

сursor.execute('INSERT INTO users_inf(id, niсkname, warnings_on_real_moment) 
        VALUES(?, ?, 0);', user_id, user_niсkname)
→ Ссылка