ValueError:无法处理 Python/MySQL 中的参数

Posted

技术标签:

【中文标题】ValueError:无法处理 Python/MySQL 中的参数【英文标题】:ValueError: Could not process parameters in Python/MySQL 【发布时间】:2019-08-06 06:31:30 【问题描述】:

我是新手

我想防止人们每次注册时出现重复的用户名。

这是我截取的代码:

def submit(self):
    username_info = username.get()
    username_password = password.get()

    #connect to db
    db = mysql.connector.connect(host = 'localhost', user = 'root', password = '', database = 'user')

    #create a cursor
    mycursor = db.cursor()
    #insert to db
    sql = ("INSERT INTO useraccess (user_type, password) VALUES (%s, %s)")

    query = (username_info, username_password)
    mycursor.execute(sql, query)
    #commit
    db.commit()

    #create a messagebox
    messagebox.showinfo("Registration", "Successfully Register")

    #if username has been used
    find_user = ("SELECT * FROM useraccess WHERE user_type = ?")
    user_query = (username_info)

    mycursor.execute(find_user, user_query)
    #if (username == username_info):
    if mycursor.fetchall():
        messagebox.showerror("Registration", "The username chosen is already used. Please select another username")
    else:
        messagebox.showinfo("Registration", "Account Created!")

但是每次运行,虽然用户名已经注册到db了,但是只显示成功创建的messagebox和错误:

ValueError:无法处理参数。

谁能帮我解决这个问题?

【问题讨论】:

您需要确保您的查询变量是元组。 【参考方案1】:

我相信问题的根源就在这条线上

user_query = (username_info)

应该是

user_query = (username_info,)

结尾的逗号是括号中的表达式和tuple 之间的语法差异。

代码的另一个问题是查询:

find_user = ("SELECT * FROM useraccess WHERE user_type = ?")

应该是:

find_user = ("SELECT * FROM useraccess WHERE user_type = %s")

【讨论】:

当我将其更改为 user_query = (username_info,) 时,它显示另一个错误是 mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement @Eve11 第二个查询字符串中的? 不是mysql.connector 中参数的有效占位符。您需要将其更改为 %s 更新了第二个问题的答案【参考方案2】:

你检查过这些变量吗,

username_info = username.get()
username_password = password.get()

它们是可处理的格式吗? (即可以直接将 username.get() 放入 user_type 吗?)

我不熟悉这种传递参数的方式

find_user = ("SELECT * FROM useraccess WHERE user_type = ?")

你有仔细检查过吗? (为什么不用 %s 方法?)

另外,您可能会收到“已创建帐户!”因为 mycursor.fetchall() 失败。

【讨论】:

我把它改成 #if username has been used find_user = ("SELECT * FROM useraccess WHERE user_type = %s") user_query = (username_info, ) mycursor.execute(find_user, user_query) #if ( username == username_info): if mycursor.fetchall(): messagebox.showerror("Registration", "选择的用户名已被使用。请选择另一个用户名") else: messagebox.showinfo("Registration", "Account Created!" ) 现在当我运行该代码时,没有错误。但它只显示“选择的用户名已被使用。请选择另一个用户名”消息框,但用户名在数据库中重复 这是因为您在检查是否存在重复之前插入了新用户; nb。 mycursor.execute(sql, query) 在检查是否存在重复之前已经添加了重复项(建议:在检查是否存在重复项后运行插入) @Eve11 或者,在包含用户名的列上使用unique constraint。您必须在 INSERT 上处理 IntegrityErrors 或使用 INSERT IGNORE。见this

以上是关于ValueError:无法处理 Python/MySQL 中的参数的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:无法处理 Python/MySQL 中的参数

ValueError:分类指标无法处理多标签指标和二元目标的混合

GridSearchCV 和 LogisticRegression 引发 ValueError:无法处理连续和二进制的混合

ValueError:分类指标无法处理多标签指标和连续多输出目标的混合

ValueError:无法处理多标签指示符和二进制的混合

Tensorflow 数据适配器错误:ValueError:无法找到可以处理输入的数据适配器