[英]Comparing user inputs to items within a list taken from a column of a database (Python3/SQL)
我正在尝试将用户输入与从 Access 数据库中的列中获取的值列表进行比较。 我尝试执行此操作的方法是读取特定列下的每个字段 append 将其放入列表,并使用“如果列表中的值:”将该用户输入与该列表进行比较。 但是,function 不起作用,因为每次我尝试与从数据库中获取的列表进行比较时,结果始终为 False,即使字符串在该列表中也是如此。
我相信这是因为 Python 采用了我想要的数据库列并将列表格式化如下:
['('string1', )' , '('string2', )' , '('string3', )']
而不是通常的设置方式,例如:
['string1','string2','string3']
当值是常规输入时,这会导致“如果列表中的值”function 失败。
即使我尝试手动将差异与字符串连接以使所有内容都显示在列表中,但比较仍然总是产生相同的 output。
这是我的实际代码:
newentry = (username, password, mail)
unameCheck = []
mailCheck = []
unamesub = str("('" + username + "', )") #this is how I tried to concatenate the extra bits of string to match up with the entries in the list.
mailsub = str("('" + mail + "', )")
print (unamesub)
print (mailsub)
print(newentry)
connector = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\\Users\\User\\Documents\\My Folder\\db.accdb;')
cursor = connector.cursor()
for row in cursor.execute("SELECT Username FROM userdata"):
unameCheck.append(row)
print(unameCheck)
for row in cursor.execute("SELECT EmailAddress FROM userdata"):
mailCheck.append(row)
print(mailCheck)
if str(unamesub) in unameCheck or username == '':
messagebox.showerror("Invalid Username", "Invalid or blank Username")
else:
if str(mailsub) in mailCheck or mail == '':
messagebox.showerror("Invalid E-mail", "E-mail either blank or already registered, Log in or reset password using the 'Save Me!' option.")
else:
cursor.execute("INSERT INTO userdata VALUES " + str(newentry))
connector.commit()
controller.show_frame(menu)
else:
messagebox.showerror("Invalid E-mail", "E-mail not confirmed, type the same E-mail into both of the required fields.")
else:
messagebox.showerror("Invalid Password", "Password not confirmed, type the same Password into both of the required fields.")
所有不必要的 print() 函数只是为了检查变量是否在做它们应该做的事情。
是否有一种方法可以从 SQL 获取列表中的字符串周围删除额外的括号,或者是否有另一种方法可以将输入与表中的元素进行比较?
谢谢
对于…的每次迭代
for row in cursor.execute("SELECT Username FROM userdata"):
... row
是一个pyodbc.Row
object,它与元组非常相似(但不相同)。 因此,即使您只选择一列, row
object 也将类似于
('gord',)
因此,不要在循环中使用unameCheck.append(row)
,而是使用unameCheck.append(row[0])
来生成简单字符串(标量)值的列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.