#python #mysql #tkinter #sql-update
Вопрос:
Я пытаюсь обновить записи из своей базы данных с именем Шаблон, клиенты таблиц. Я получаю обновленную информацию из Tkinter Treeview. Я обновляю любое поле, кроме идентификатора пользователя, который является моим первичным ключом. Я получаю синтаксическую ошибку при выполнении cur.execute(sql_command). cur определяется как мой курсор.
# Function to Edit Record
def edit_client():
# Update the Database
print(user_id_box.get())
sql_command = ("UPDATE clients SET
f_name = f_name_box.get(),
l_name = l_name_box.get(),
email = email_box.get(),
phone = phone_box.get(),
price = price_box.get(),
address = address_box.get(),
city = city_box.get(),
state = state_box.get(),
country = country_box.get(),
zipcode = zipcode_box.get() WHERE user_id = user_id_box.get()")
# Execute the SQL command
cur.execute(sql_command)
# Commit the changes to the database
mydb.commit()
# Clear the old entry
clear_record()
# Refresh the Data Frame
query_database()
Комментарии:
1. Не ошибка отступа? Я вижу, что вы забыли пробел в каждой последующей строке
sql_command
.
Ответ №1:
Самым простым решением было бы использовать f-строку и фигурные скобки для правильного размещения значений внутри строки. Здесь я также использовал строки документов, так что вам не нужны обратные косые черты.
def edit_client():
print(user_id_box.get())
sql_command = f"""UPDATE clients SET
f_name = {f_name_box.get()},
l_name = {l_name_box.get()},
email = {email_box.get()},
phone = {phone_box.get()},
price = {price_box.get()},
address = {address_box.get()},
city = {city_box.get()},
state = {state_box.get()},
country = {country_box.get()},
zipcode = {zipcode_box.get()} WHERE user_id = {user_id_box.get()}"""
cur.execute(sql_command)
mydb.commit()
clear_record()
query_database()
однако
Я настоятельно рекомендую вам очистить ваши входные данные и передать их в качестве аргументов исполнителю, поскольку SQL-инъекции по-прежнему актуальны, даже если вы не заботитесь о безопасности, вы все равно можете просто прервать запрос, нарушив входные данные.
Я не знаю, какую библиотеку вы используете для связи с БД, но ее документация должна охватывать ее, если она не относится к началу 1970-х годов, созданная каким-то студентом.
Комментарии:
1. Помимо SQL-инъекции, ваше решение не работает, если какое-либо поле является строковым полем. Например , если
f_name
это строковое поле иf_name_box.get()
возвращаетJohn
, то окончательный SQL будет чем-то вродеUPDATE ... SET f_name = John, ...
того, что недопустимо. Это должно быть похожеUPDATE ... SET f_name = "John", ...
. Вместо f-строки следует использовать заполнители.
Ответ №2:
Обратите внимание, что f_name.get()
внутри строки подобное "f_name = f_name.get()"
работать не будет.
В вашем случае вы можете использовать заполнитель ( %s
для MySQL) в инструкции SQL:
sql_command = f"""UPDATE clients
SET f_name = %s, l_name = %s,
email = %s, phone = %s,
price = %s, address = %s,
city = %s, state = %s,
country = %s, zipcode = %s
WHERE user_id = %s"""
cur.execute(sql_command, (f_name_box.get(), l_name_box.get(),
email_box.get(), phone_box.get(),
price_box.get(), address_box.get(),
city_box.get(), state_box.get(),
country_box.get(), zipcode_box.get(),
user_id_box.get()))
Комментарии:
1. Разве это невозможно использовать
WHERE user_id = %s
?2. @CoolCloud Это опечатка, спасибо за напоминание.
3. Большое спасибо. Да, это работает с заполнителем. Очень благодарен.