【问题标题】:'SQLite' Database is Locked Error“SQLite”数据库被锁定错误
【发布时间】:2018-06-11 01:25:47
【问题描述】:

在创建“插入”时,我使用了“尝试和除外”方法来提醒用户何时输入了重复的主键,并使用消息框。然而,当输入重复键时,下次运行“INSERT”时,会出现以下错误:

“sqlite3.OperationalError: 数据库被锁定”

还有其他方法可以解决这个问题吗?

我已将下面的“插入”添加到帖子中,并创建了相关的表格。

插入函数

    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 );''')

【问题讨论】:

  • 您是否尝试在 except 块之后关闭连接? conn.close()
  • 我认为这是有问题的主要问题@EytanAvisror,在使用“try-with”后,我删除了 .close() 函数调用,但回首过去,它看起来确实像我的逻辑错误因为它在“除外”之前关闭了数据库。

标签: python sql python-3.x sqlite


【解决方案1】:

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()

【讨论】:

  • 如果我没记错你解释的“尝试”是要走的路!它处理查询就像 'with-open' -file 完成后关闭...
  • 是的,我认为 context manager 是一个非常优雅的构造,用于此类目的。
  • 不幸的是,我的投票无法在全球范围内查看,但接受了答案! @yarwest
  • 点赞!只是一个奇怪的问题,如果你有一个上下文管理器,我可以知道你为什么仍然调用提交吗?还有一种方法可以指定当数据库不再锁定时触发的回调
  • @PirateApp 事实证明你不必显式调用 commit,我的错 :) 每当提交事务时,数据库都会解锁,所以在 try 块之后。
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多