Почему при вставке в таблицу передаваемые значения воспринимаются как названия столбцов?

Хочу полученные от пользователя данные сохранять в БД. Но код ниже не работает.

Не находит колонки, что верно, такой колонки нету, потому что Uus - это введенные данные пользователем, а не название колонки в таблице в БД.

Ошибка:

sqlite3.OperationalError: no such column: Uus

Код сохранения переданных данных пользователем (name_, surname_, age_) в таблицу Profiles(id, First_name, Last_name, Age):

def save_to_sqllite(name_,surname_,age_):
conn = sqlite3.connect(os.path.join(PATH,'Chinook_Sqlite.sqlite')) #подключаемся к БД
cursor = conn.cursor() #создаем курсов для обработки запросов к БД
cursor.execute("SELECT COUNT(ID) FROM Profiles")
next_ID = cursor.fetchall()[0][0] + 1
cursor.execute(f"INSERT INTO Profiles (id, First_name, Last_name, Age) VALUES ({next_ID},{name_},{surname_},{age_});")
conn.commit() #сохраняем изменения в БД
conn.close() #закрываем подключение к БД
return print(f'saved')

Подскажите, почему в строке:

cursor.execute(f"INSERT INTO Profiles (id, First_name, Last_name, Age) VALUES ({next_ID},{name_},{surname_},{age_});") 

передаваемые значения воспринимаются, как названия столбцов?

И как сделать так, чтобы вставлять данные от пользователя в нужные столбцы в таблице?


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

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

попробуйте так:

sql = """INSERT INTO Profiles (id, First_name, Last_name, Age) VALUES(?,?,?,?)"""
params = (next_ID, name_, surname_, age_)
cursor.execute(sql, params)

где id, First_name, Last_name, Age - реальные наименования столбцов таблицы БД, а next_ID, name_, surname_, age_ - имена существующих переменных в Python скрипте.

PS всегда старайтесь использовать параметры в SQL запросе вместо подставления значения переменных - это поможет избежать SQL Injections

→ Ссылка