' SQLite的'数据库已锁定错误

时间:2017-12-31 12:14:13

标签: python sql python-3.x sqlite

虽然创建了一个' INSERT',但我已经包含了"尝试和除了"使用消息框提醒用户何时输入重复的主键。然而,当输入重复的密钥时,下一次“插入”#39;运行,它给出以下错误:

  

" sqlite3.OperationalError:数据库被锁定"

是否还有另一种方法可以解决这个问题?

我已经添加了' INSERT'下面是相关表创建的帖子。

插入功能

    try:
        conn=sqlite3.connect("Homework_Planner.db")
        conn.execute("INSERT INTO Student (StudentID, Email, Password) \
                                                   VALUES  (?,?,?);",(student_ID, student_Email, hashedPassword,))
        conn.commit()
        #Commits changes made to the database.
        conn.close()
        #Closes the database..


    except sqlite3.IntegrityError:
        messagebox.showinfo('Setup Error!', 'Student ID already exists.')

        x=windows() 
        x.student_Setup()

表格创建

conn=sqlite3.connect("Homework_Planner.db")
conn.execute (''' CREATE TABLE IF NOT EXISTS Student  (
 StudentID             TEXT       PRIMARY KEY   NOT NULL,
 Email                 TEXT       NOT NULL,
 Password              TEXT       NOT NULL );''')

1 个答案:

答案 0 :(得分:3)

在连接关闭之前抛出sqlite3.IntegrityError,这会导致数据库锁定,因为它认为它仍然与应用程序连接。为了防止这种情况,我建议关闭catch块中的连接,以确保在抛出错误时它也会被关闭。或者,您可以使用finally块来关闭连接,但就像以前的方法一样,这很容易出错。

处理所有这些的新方法和改进方法是使用try-with块(也称为context manager)。通过这样做,您可以打开try块内的资源,它将在结束时自动关闭。在您的情况下,这可能如下所示:

try:
    with sqlite3.connect("Homework_Planner.db") as conn:
        conn.execute("INSERT INTO Student (StudentID, Email, Password) \ VALUES (?,?,?);",(student_ID, student_Email, hashedPassword,))
except sqlite3.IntegrityError:
    messagebox.showinfo('Setup Error!', 'Student ID already exists.')
    x=windows()
    x.student_Setup()