所以我知道这个问题在烧瓶中并不新鲜,人们之前已经问过了。但是我在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语句后,我收到操作错误:数据库被锁定。 有人可以简单地说出这个错误意味着什么吗?以及如何解决它。 提前致谢
答案 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很轻但不是那么轻