虽然创建了一个' 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 );''')
答案 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()