Получение данных от пользователя и сохранение их в базе данных - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь получить данные от пользователя и вставить их в свою базу данных. Все работает нормально, пока я не нажму кнопку «Сохранить». Затем я получаю следующие ошибки:

Исключение в обратном вызове Tkinter (последний последний вызов): Файл "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/ init .py ", строка 1705, в вызов , возврат файла self.func (* args), файл" /Users/alidemirkazik/PycharmProjects/GUI_Test/GUI_Test.py ", строка 51, вadd_customer mycursor.execute (sql, val) Файл "/Users/alidemirkazik/PycharmProjects/GUI_Test/venv/lib/python3.7/site-packages/mysql/connector/cursor.py", строка 551, выполнить execute self._handle_result (self._connection.cmd_query (stmt)) Файл "/Users/alidemirkazik/PycharmProjects/GUI_Test/venv/lib/python3.7/site-packages/mysql/connector/connection.py", строка 490, в cmd_query result = self. _handle_result (self._send_cmd (ServerCmd.QUERY, query)) Файл "/Users/alidemirkazik/PycharmProjects/GUI_Test/venv/lib/python3.7/site-packages/mysql/connector/connection.py", строка 395, в _handleподнять error.get_exception (package) mysql.connector.errors.DatabaseError: 1366(HY000): Неверное целочисленное значение: '' для столбца 'ID' в строке 1

Благодарим вас за помощь. Спасибо!

r = Tk()
r.title('Adding New Customer')
r.geometry("175x62")


def quit():
    r.destroy()


def contact():
    contact_window = Toplevel(r)
    Label(contact_window, text='ID').grid(row=0)
    Label(contact_window, text='Name').grid(row=1)
    Label(contact_window, text='Address').grid(row=2)
    Label(contact_window, text='Country').grid(row=3)
    Label(contact_window, text='Age').grid(row=4)
    input1 = Entry(contact_window)
    input2 = Entry(contact_window)
    input3 = Entry(contact_window)
    input4 = Entry(contact_window)
    input5 = Entry(contact_window)
    input1.grid(row=0, column=1)
    input2.grid(row=1, column=1)
    input3.grid(row=2, column=1)
    input4.grid(row=3, column=1)
    input5.grid(row=4, column=1)

    first_id = input1.get()
    first_name = input2.get()
    first_address = input3.get()
    first_country = input4.get()
    first_age = input5.get()

    def add_customer():
        mycursor = mydb.cursor()
        sql = "INSERT INTO customers (ID, Name, Address, Country, Age) VALUES (%s, %s, %s, %s, %s)"
        val = (first_id, first_name, first_address, first_country, first_age)
        mycursor.execute(sql, val)
        mydb.commit()

    button3 = Button(contact_window, text="Save", command=add_customer)
    button3.grid(row=5, column=1)


button1 = Button(r, text="Contact", command=contact).pack(fill=X, ipady=5)
button2 = Button(r, text="Exit", command=quit).pack(fill=X, ipady=5)

r.mainloop()

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Похоже, что ID, который вы добавляете, не является целым числом, которое является типом, ожидаемым в базе данных.

Я думаю, вам просто нужно привести first_id к целому числу. Итак, что-то вроде этого:

val = (int(first_id), first_name, first_address, first_country, first_age)

Более того, я не считаю хорошей идеей разрешить конечному пользователю вводить идентификатор для базы данных. Я бы посоветовал вам сделать так, чтобы база данных автоматически заполняла идентификаторы новых записей пошаговым способом.

0 голосов
/ 08 ноября 2019

В этой строке похоже, что вы говорите, что ожидаете строку для первого значения в VALUES

sql = "INSERT INTO customers (ID, Name, Address, Country, Age) VALUES (%s, %s, %s, %s, %s)"

замените на это, чтобы иметь заполнители целочисленного формата, где это уместно

sql = "INSERT INTO customers (ID, Name, Address, Country, Age) VALUES (%d, %s, %s, %s, %d)"

Также может возникнуть проблема с самим «ID», я упоминаю об этом, потому что в фрагменте ошибки написано «Неверное целочисленное значение». Когда ожидается само целое число, оно всегда говорит (по крайней мере для меня) «неожиданное (строка / тип) для [x], ожидаемое целое число». Или "Получил строку, ожидаемое int"

Я также думаю, что вам нужно инициализировать текстовые переменные для полей ввода. Также похоже, что вы используете импорт с подстановочными знаками, я бы импортировал библиотеку tkinter как tk, чтобы помочь отследить в целях отладки. Но это только мое предпочтение.

import tkinter as tk #for python 3

#for each entry/variable
f_id = tk.StringVar()
input1 = tk.Entry(contact_window, textvariable = f_id) 
first_id = int(input1.get()) #int() when needed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...