2015-08-28 3 views
3

У меня возникла ошибка блокировки базы данных, когда мне нужно удалить запись из таблицы actions.база данных sqlite3 заблокирована

есть две программы, чтение и запись в базе данных sqlite3

один по переменной программе, записать результаты аппаратных действий на столе sqlite3 и другой питон скрипт, который читать записи из SQLite и обрабатывать их и удалите строки после завершения задания.

но сценарий питона показать database is locked ошибку на удаление строки ..

имя БД: db.db

дб стол: 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=None и timeout=30000 на мое соединение ection , но я получаю ошибку блокировки базы данных много раз

+0

Сценарий может быть блокировка базы данных. Почему вы обертываете запросы БД, запись файла и веб-пост в цикле while, который на самом деле бесконечен, поскольку нет 'break?' – Parfait

+1

, почему вы открываете базу данных из цикла while? вы открываете и закрываете соединение на 'while True:' – roozgar

ответ

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

Благодарим вас за ответ. Но 'while True' поможет мне каждый день отслеживать базу данных для новых записей, и каждый раз я должен проверять базу данных, чтобы найти новую запись и обработать ее на моем веб-сервисе ... поэтому, если я удалю он должен найти другой цикл для проверки базы данных через 1 или 0,5 секунды .... –

+2

Затем рассмотрите использование цикла cur.fetchall(). См. Править. – Parfait

+0

ok. после цикла и выборки все сценарии записи умрут !? как я могу получить другие записи после этого? –

0

Ветвь if (data is None) : не фиксирует, поэтому процесс Python на неопределенный срок хранит блокировку чтения в базе данных. Добавьте conn.commit() к этой ветке (или переместите ее в ветке else из if/else).

Я также предлагаю не использовать SQLite в качестве очереди. Рассмотрим лучший инструмент, например, именованные каналы, если вы находитесь в Linux.

+1

вы уверены, что прочитанный запрос заблокирует базу данных !? –

Смежные вопросы