raise errors.InterfaceError(ERR_NO_RESULT_TO_FETCH) mysql.connector.errors.InterfaceError: No result set to fetch from

raise errors.InterfaceError(ERR_NO_RESULT_TO_FETCH) mysql.connector.errors.InterfaceError: No result set to fetch from

我正在尝试制作一个简单的 tkinter 程序,其中包含用于放置您的用户名、电子邮件和密码的条目,我正在尝试让它检查用户名是否已经存在,但它给了我这个错误。我知道在 Whosebug 上还有其他关于它的问题,但这些并没有帮助我。


import mysql.connector
from tkinter import *

root = Tk()
root.title("Login")
root.iconbitmap("profile.ico")

db = mysql.connector.connect(
    db = "pythonlogin",
    host="127.0.0.1",
    user="root",
    password="[password]"
)

cursor = db.cursor()

usernameLabel = Label(root, text='Username: ')
emailLabel = Label(root, text='Email: ')
passwordLabel = Label(root, text='Password: ')

usernameEntry = Entry(root, width=30)
emailEntry = Entry(root, width=30)
passwordEntry = Entry(root, width=30)

usernameLabel.grid(row=0, column=0)
emailLabel.grid(row=1, column=0)
passwordLabel.grid(row=2, column=0)

usernameLabel.config(font=("Roboto", 12))
emailLabel.config(font=("Roboto", 12))
passwordLabel.config(font=("Roboto", 12))

usernameEntry.grid(row=0, column=1)
emailEntry.grid(row=1, column=1)
passwordEntry.grid(row=2, column=1)

class userInfo():
    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.password = password
    
    def addInfoToDB(self):
        query = "INSERT INTO pylogin (Username, Email, Password) VALUES (%s, %s, %s)"
        values = (self.username, self.email, self.password)
        cursor.execute(query, values)
        db.commit()
        print(cursor.rowcount, "record inserted.")

errorLabel = Label(root)
errorLabel.grid(row=4, column=1)

def submitInfo():
    fetchInfo = cursor.fetchall()
    if usernameEntry.get() == "" or emailEntry.get() == "" or passwordEntry.get() == "":
        errorLabel.config(text="Error: Couldn't get value of all entries", fg="red")
    if (usernameEntry.get(),) in fetchInfo:
        errorLabel.config(text="Username already exists in the database!")
    else:
        errorLabel.config(text="Success!", fg="green")
        details = userInfo(usernameEntry.get(), emailEntry.get(), passwordEntry.get())
        details.addInfoToDB()

submitButton = Button(root, text="Submit", command=submitInfo)
submitButton.grid(row=3, column=1, ipadx=50)
submitButton.config(font=("Roboto", 10))

root.mainloop()

submitInfo 方法中,您有 fetchInfo = cursor.fetchall() 但没有执行任何查询。

>>> import mysql.connector as mc
>>> conn = mc.connect(database='test')
>>> cur = conn.cursor()
>>> cur.fetchall()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
...
mysql.connector.errors.InterfaceError: No result set to fetch from

您需要执行 SELECT 查询才能获取结果。

看起来您正在检查数据库中是否存在输入的用户名,因此您可能想查询数据库中的该名称:

def submitInfo():

    if usernameEntry.get() == "" or emailEntry.get() == "" or passwordEntry.get() == "":
        errorLabel.config(text="Error: Couldn't get value of all entries", fg="red")

    # Query the database for a row with a matching username
    stmt = """SELECT Username, Email, Password FROM pylogin WHERE Username = %s""" 
    cursor.execute(stmt, (usernameEntry.get(),))
    # There should be at most one matching row, so we can use
    # the cursor's fetchone method to retrieve it.
    row = cursor.fetchone()
    if row:
        errorLabel.config(text="Username already exists in the database!")

    else:
        errorLabel.config(text="Success!", fg="green")
        details = userInfo(usernameEntry.get(), emailEntry.get(), passwordEntry.get())
        details.addInfoToDB()