【问题标题】:Unable to read from database records sqlite3 python无法从数据库记录中读取sqlite3 python
【发布时间】:2025-12-20 12:25:12
【问题描述】:

这是我第一次使用 sqlite3 并且我正在使用数据库。我正在制作一个在线井字游戏,这样我就可以和我的朋友一起玩。在def dataRead(): 中,我尝试读取用户从注册窗口输入的数据,并尝试检查数据是否已保存在数据库中。如果是,用户必须输入另一个用户名。

    def register():
        ##initialising sqlite
        con = sqlite3.connect("userData.db")
        c = con.cursor()
        def submit():
            #creating tables in the database
            def createTable():
                c.execute("CREATE TABLE IF NOT EXISTS userInfo(username TEXT, password TEXT)")

            def dataRead():
                username = user.get()
                password = pword.get()
                c.execute("SELECT username FROM userInfo")
                data = c.fetchall()
                try:
                    for row in data:
                        if row == username:
                            Label(regWin, text = "Sorry, username already in use...\nTry another one.", fg = "red").pack()
                            print(data)
                        else:
                            dataEntry(username, password)
                except TypeError:
                    dataEntry(username, password)
                    
            def dataEntry(username, password):
                c.execute("INSERT INTO userInfo(username, password) VALUES (?, ?)", (username, password))
                con.commit()
                
            createTable()
            dataRead()
        



我尝试使用c.fetchall() 读取userInfousername 的记录,以便程序可以检查用户名是否可用,但它似乎不起作用(至少对我而言) .

【问题讨论】:

  • “似乎不起作用”是什么意思?它是否返回错误的数据?如果抛出错误,如果是,错误是什么” 函数根本没有被调用?
  • 它根本不返回任何东西,也不写入数据库
  • 您是否验证了函数是否在您期望它们被调用时被调用?你做了什么来调试这个?
  • 您不应该创建多个Tk 实例。如果您需要多个窗口,请创建一次Tk 的实例,然后将其他窗口创建为Toplevel 的实例。您还应该只拨打一次mainloop
  • 那为什么你的例子中有 tkinter 代码?如果这纯粹是一个 sqlite 问题,请删除所有 tkinter 代码。

标签: python sqlite tkinter tkinter-entry


【解决方案1】:

fetchall 方法返回一个元组列表,无论选择一列还是多列。因此,if row == username: 的比较永远不会成立。如果你想要元组的第一个元素,它是通常的,即row[0]

【讨论】:

  • 那应该是什么?
  • @shmifful 正如我所提到的,data[0] 我猜应该没问题。甚至更改您的查询
  • 是的,查询仅适用于数据[0]。我应该把它改成什么?
  • 快速怀疑'SELECT username FROM userInfo',您是说这里的usernameusername = user.get()。如果是这样,那么这是错误的做法
  • @shmifful row 是列表 data 中的一个元组。 username 是元组的第一个元素,地址为 row[0]
【解决方案2】:

返回的记录是元组,所以你需要改用row[0] == username

def dataRead():
    username = user.get()
    password = pword.get()
    
    c.execute("SELECT username FROM userInfo")
    data = c.fetchall()
    found = False
    for row in data:
        if row[0] == username:
            found = True
            Label(regWin, text = "Sorry, username already in use...\nTry another one.", fg = "red").pack()
            print(row)
            break
    if not found:
        dataEntry(username, password)

但是,您不需要从数据库中获取所有记录。您可以使用WHERE 子句获取所需的记录:

def dataRead():
    username = user.get()
    password = pword.get()

    c.execute('SELECT username FROM userInfo WHERE username = ?', (username,))
    data = c.fetchone()
    if data:
        Label(regWin, text = "Sorry, username already in use...\nTry another one.", fg = "red").pack()
        print(data)
    else:
        dataEntry(username, password)

另外最好将username 字段设为唯一字段:

def createTable():
    c.execute("CREATE TABLE IF NOT EXISTS userInfo(username TEXT PRIMARY KEY, password TEXT)")

这样表中就没有重复的用户名了。

【讨论】: