繁体   English   中英

sqlite3 数据库被锁定

[英]sqlite3 database is locked

当我必须从actions表中删除记录时,出现数据库锁定错误。

有两个程序可以在 sqlite3 数据库上读写

一个是将硬件操作的结果写入sqlite3表上的ac程序,另一个是从sqlite读取记录并处理它们并在完成作业后删除行的python脚本。

但是python脚本显示database is locked在删除行时database is locked错误..

数据库名称: db.db

db table : TABLE 'actions' ( 'rid' INTEGER PRIMARY KEY AUTOINCREMENT, 'owner' INTEGER, 'action' TEXT, 'node' TEXT, 'value' TEXT

蟒蛇脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3
import time
import os.path
import requests
#import urllib.parse

#defines
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(BASE_DIR+"/dbs/", "db.db")
wd_file_path = os.path.join(BASE_DIR, "wd")
pid = os.getpid()
conn = sqlite3.connect(db_path, isolation_level=None ,timeout=30000)
print ("Opened database successfully");
while True:
    res = conn.execute("select * from 'actions' where 'owner'='1';")
    #conn.commit()
    data=res.fetchone()
    print(data)
    if (data is None) :
        print('nothing @ '+str(time.time()))
        with open(wd_file_path, 'w') as file_:
            file_.write("{'pid'='"+str(pid)+"','time'='"+str(time.time())+"'}")
        time.sleep(0.5)
    else:
        #print(data)
        r = requests.post("http://127.0.0.1/json.php", data={'act': data[2], 'val': data[4]})
        #if (r.text == '1'):
        conn.execute("delete from 'actions' where 'rid'="+str(data[0])+";")
        conn.commit()
        #else:
        #   print(r.text)

如您所见,我在连接上设置了isolation_level=Nonetimeout=30000 ,但是我多次收到数据库锁定错误

考虑删除无限while True循环并使用连接游标来执行和获取语句:

conn = sqlite3.connect(db_path, isolation_level=None ,timeout=30000) 
print("Opened database successfully")

cur = conn.cursor()
cur.execute("select * from 'actions' where 'owner'='1';") 

for data in cur.fetchall() 
  print(data) 

  if (data is None): 
    print('nothing @ '+str(time.time())) 
    with open(wd_file_path, 'w') as file_: 
      file_.write("{'pid'='"+str(pid)+"','time'='"+str(time.time())+"'}") 
    time.sleep(0.5) 
  else: 
    #print(data) 
    r = requests.post("http://127.0.0.1/json.php", data={'act': data[2], 'val': data[4]}) 
    #if (r.text == '1'): 
    cur.execute("delete from 'actions' where 'rid'="+str(data[0])+";") 
    conn.commit() 
    #else: 
    # print(r.text)

cur.close()
conn.close()

if (data is None) :分支不会提交,因此 Python 进程无限期地持有数据库的读锁。 conn.commit()添加到该分支(或将 else 分支中的那个移出 if/else)。

我还建议不要使用 SQLite 作为这样的队列。 如果您使用的是 Linux,请考虑使用更好的工具,例如命名管道。

在使用烧瓶时,我只是设置了 app.run(debug=False) 并且它对我有用..

  • 请保留一份数据库备份
  • 删除您的日志日志文件
  • 用备份的数据库替换锁定的数据库

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM