繁体   English   中英

将用户输入与取自数据库列的列表中的项目进行比较(Python3/SQL)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM