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 шт):
Когда Вы выполняете вот такое
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)