我是新手
我想在每次人们注册时阻止重复的用户名。
这是我的代码段:
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中注册,但它只显示成功创建的消息框和错误:
ValueError:无法处理参数。
有人可以帮我解决这个问题吗?
我相信问题的根源就在于此
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")
你检查过这些变量吗
username_info = username.get()
username_password = password.get()
他们是否采用可执行的格式? (即你可以直接将username.get()放入user_type吗?)
我不熟悉这种传递参数的方式
find_user = ("SELECT * FROM useraccess WHERE user_type = ?")
你仔细检查过这个吗? (为什么不是%s方法?)
另外,你可能会得到“帐户创建!”因为mycursor.fetchall()失败了。