操作错误:数据库已锁定

时间:2014-11-11 10:34:17

标签: python flask

所以我知道这个问题在烧瓶中并不新鲜,人们之前已经问过了。但是我在bash中执行数据库命令时仍然遇到问题,因为我是python的新手。 这就是我所做的

import sqlite3
conn = sqlite.connect('/home/pjbardolia/mysite/tweet_count.db')
c = conn.cursor()

c.execute("create table count_twitter (count_id integer primary key autoincrement ,count_present integer not null,last_tweet not null)")

c.execute(insert into count_twitter values('',10,10))

然而,在执行insert语句后,我收到操作错误:数据库被锁定。 有人可以简单地说出这个错误意味着什么吗?以及如何解决它。 提前致谢

6 个答案:

答案 0 :(得分:22)

这就是错误的含义:

  

SQLite意味着是一个轻量级数据库,因此无法支持   高并发性。 OperationalError:数据库是锁定错误   表明您的应用程序遇到的并发性比   sqlite可以在默认配置中处理。这个错误意味着一个   线程或进程对数据库连接具有独占锁定   另一个线程超时等待锁被释放。

     

Python的SQLite包装器具有确定的默认超时值   允许第二个线程在锁定之前等待多长时间   超时并引发OperationalError:数据库被锁定错误。

     

如果您收到此错误,可以通过以下方式解决:

     

切换到另一个数据库后端。在某一点SQLite   对于真实世界的应用程序而言,它们变得太“精简”了   并发错误表明你已达到这一点。

     

重写代码以减少并发性并确保数据库   交易是短暂的。

     

通过设置超时数据库来增加默认超时值   选项。

您的代码中可能有另一个未关闭或未提交的连接,这会导致此错误。当它已经被另一个execute锁定时,基本上尝试做第二个{{1}}。如果您真的想要并发交易,则需要RDBMS

答案 1 :(得分:2)

确保使用con.commit()

提交其他连接

答案 2 :(得分:1)

当我在烧瓶应用程序中使用线程时,我遇到了同样的问题,我几乎尝试了所有方法(检查ORM命令的语法是否正确等等),但是所有这些尝试都没有解决我的问题。

我做的最后一件事是将数据库从SQLite3更改为PostgreSQL,现在一切正常。

答案 3 :(得分:0)

我遇到了同样的问题,发现杀死所有Python进程可以解决问题。

答案 4 :(得分:0)

这是我用来管理并发的内容。我从270个进程中击中一个DB。只是增加SQLite的超时没有帮助,但是这种只等待一段时间而不尝试连接一段时间的方法似乎可行。可以调整尝试次数(50)和等待时间(10-30秒)。我正在从长时间运行的分析中收集结果,因此10-30秒是可以的,但也许1-3可以奏效。

import random
import sqlite3

def do_query(path, q, args=None, commit=False):
    """
    do_query - Run a SQLite query, waiting for DB in necessary

    Args:
        path (str): path to DB file
        q (str): SQL query
        args (list): values for `?` placeholders in q
        commit (bool): whether or not to commit after running query
    Returns:
        list of lists: fetchall() for the query
    """
    if args is None:
        args = []
    for attempt in range(50):
        try:
            con = sqlite3.connect(path)
            cur = con.cursor()
            cur.execute(q, args)
            ans = cur.fetchall()
            if commit:
                con.commit()
            cur.close()
            con.close()
            del cur
            del con
            return ans
        except sqlite3.OperationalError:
            time.sleep(random.randint(10, 30))

答案 5 :(得分:0)

我从DBBrowser for sqlite GUI工具中删除了一行,然后发布了表单数据,并得到了相同的错误。

我仔细查看GUI并激活了“写入更改”选项卡,这意味着删除后,我必须单击该选项卡。我单击该按钮,问题就解决了。 sqllite3很轻但不是那么轻