我必须从actions
表中删除记录时出现数据库锁定错误。
有两个程序可以在sqlite3数据库上读写
一个是在sqlite3表上写入硬件操作结果的c程序,另一个是从sqlite读取记录并在完成作业后处理它们并删除行的python脚本。
但是删除行时python脚本显示database is locked
错误..
db name:db.db
db表:
TABLE 'actions' (
'rid' INTEGER PRIMARY KEY AUTOINCREMENT,
'owner' INTEGER,
'action' TEXT,
'node' TEXT,
'value' TEXT
python脚本:
#!/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=None
和timeout=30000
放在我的连接上
但我多次得到数据库锁定错误
答案 0 :(得分:1)
考虑删除无限while True
循环并使用connection cursor执行和获取语句:
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()
答案 1 :(得分:0)
if (data is None) :
分支不提交,因此Python进程无限期地保持对数据库的读锁定。将conn.commit()
添加到该分支(或将else分支中的一个移出if / else)。
我还建议不要将SQLite用作这样的队列。考虑一个更好的工具,例如命名管道,如果你在Linux上。
答案 2 :(得分:0)
使用烧瓶时,我只设置了app.run(debug = False) 对我有用。