2015-07-15 6 views
0

Я пытаюсь написать два процесса с использованием python, которым требуется доступ к той же таблице базы данных sqlite. Один из процессов обновляет таблицу, вставляя новые данные, а другой процесс извлекает информацию из той же таблицы. Однако, когда второй второй процесс запускает запрос выбора, база данных уже заблокирована, и я получаю «Операционная память: база данных заблокирована». Ниже приведен код для обоих процессов. Цените любую помощьНесколько соединений python с одним и тем же sqlite Таблица базы данных

process : 1 
    ------------ 
    while True: 

     print "Updating" 
     try: 
      conn = sqlite3.connect('test.db') 
      c = conn.cursor() 
      c.execute('PRAGMA journal_mode = WAL') 
      c.executemany('INSERT INTO test_table VALUES (?,?,?,?,?)', insertdata) 
      conn.commit() 
      conn.close() 
     except: 
      pass   
     time.sleep(60) 

    process : 2 
    ------------ 

     conn = sqlite3.connect('test.db') 
     c = conn.cursor() 
     c.execute("select * from test_table where id='{}' and date = '{}' order by time desc".format(recv_data,datetime.datetime.now().date().isoformat())) 
     data= c.fetchall() 
     conn.close() 

Приведенная выше ссылка предполагает, что возможно несколько соединений в sqlite. Однако он не предлагает, как это сделать.

+2

Дополнительная информация здесь: http://stackoverflow.com/questions/5102027/can-sqlite-support-multiple-user – Richard

+0

Ссылка, приведенная выше, позволяет предположить, что возможно несколько соединений в sqlite. Однако он не предлагает, как это сделать. – Learner

+0

Я пробовал свой код: записывал каждые 5 секунд, каждый раз каждые 0,1 секунды (python 3.4.2, sqlite 3.8.10.2) и не мог воспроизвести ваше сообщение об ошибке - возможно, у вас есть . – Richard

ответ

0

База данных блокирует доступ после любой операции записи в течение нескольких миллисекунд, поэтому вы можете попробовать time.sleep(1) в процессе: 2, чтобы избежать этого столкновения, по крайней мере, в первый раз.

+0

, @ Ричард, я думаю, что это не проблема. Поскольку настройка тайм-аута по умолчанию для sqlite составляет 5 секунд, блокировка в несколько миллисекунд не должна вызывать проблемы. Я думаю, что проблема в другом. – Learner