如何知道哪个进程负责“ OperationalError:数据库已锁定”?

如何知道哪个进程负责“ OperationalError:数据库已锁定”?,第1张

如何知道哪个进程负责“ OperationalError:数据库已锁定”?

解决方案: 始终关闭

cursor
for(甚至只读)查询!

首先,这是重现问题的一种方法:

  1. 第一次运行此代码,一次:
        import sqlite3    conn = sqlite3.connect('anothertest.db')    conn.execute("CREATE TABLE IF NOT EXISTS mytable (id int, description text)")    for i in range(100):        conn.execute("INSERT INTO mytable VALUES(%i, 'hello')" % i)    conn.commit()

初始化测试。

  1. 然后开始一个 只读 查询:
        import sqlite3, time    conn = sqlite3.connect('anothertest.db')    c = conn.cursor()    c.execute('SELECt * FROM mytable')    item = c.fetchone()    print(item)    print('Sleeping 60 seconds but the cursor is not closed...')    time.sleep(60)

在执行下一步时 保持此脚本运行

  1. 然后尝试删除一些内容并提交:
        import sqlite3    conn = sqlite3.connect('anothertest.db')    conn.execute("DELETe FROM mytable WHERe id > 90")    conn.commit()

确实会触发此错误

sqlite3.OperationalError:数据库已锁定

为什么?因为无法删除读取查询当前正在访问的数据:如果游标仍处于打开状态,则意味着仍可以使用

fetchone
或来获取数据
fetchall

解决错误的方法如下:在步骤2中,只需添加:

    item = c.fetchone()    print(item)    c.close()    time.sleep(60)

然后,在此脚本仍在运行时,启动脚本#3,您将看到没有更多错误。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5667188.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存