2014-08-27 3 views
0

Моих CherryPy приложение делает некоторые очистки каждый час с помощью следующего кода:Peewee говорит «не может совершить - сделка не активна»

def every_hour(): 
    two_hours_ago = time.time() - 2 * 60 * 60 
    DbChoice.delete().where(DbChoice.time_stamp < two_hours_ago).execute() 

monitor_every_hour = Monitor(cherrypy.engine, every_hour, frequency=60 * 60) 
monitor_every_hour.start() 

Иногда он падает с него следующим сообщением:

Traceback (most recent call last): 
    File "C:\Python34\lib\site-packages\peewee.py", line 2364, in execute_sql 
    self.commit() 
    File "C:\Python34\lib\site-packages\peewee.py", line 2371, in commit 
    self.get_conn().commit() 
sqlite3.OperationalError: cannot commit - no transaction is active 

Этих thread и другие говорят о том, как исправить проблему при работе непосредственно с sqlite, но я использую Peewee, и я не знаю, что я делаю что-то не так с Peewee, или это ошибка, и мне нужно ее обойти.

я начинаю соединение с:

db = peewee.SqliteDatabase(path_name + '/doc.db', check_same_thread=False) 
+0

Вот ответ: http://stackoverflow.com/questions/25850681/cherrypy-sqlite3-peewee-crashes-when-two-processes-execute-the-same-code-at/25851123#25851123 – stenci

ответ

1

Похоже, запрос автоматически фиксируется по умолчанию. Итак, попробуйте установить автосообщение в False.

db = peewee.SqliteDatabase(path_name + '/doc.db', check_same_thread=False) 
db.set_autocommit(False) 

http://peewee.readthedocs.org/en/2.0.2/peewee/cookbook.html#changing-autocommit-behavior

Надеется, что это помогает!

+0

Как сделать Я не совершаю транзакцию с Peewee? Если это так, то почему он работает все время, и он терпит неудачу один раз каждые 2-3 дня? – stenci

+0

Хммм, поэтому большинство коммитов точно обновляет данные в db? Использует ли ваше delete() совместное соединение db или вы создаете новое соединение с auto-commit, установленным в true? Можете ли вы прокомментировать фиксацию и посмотреть, вставлена ​​ли ваша запись или обновлена ​​ли она? –

+0

Когда приложение запускается, выполняется строка 'db = ...', как показано в сообщении. Я не знаю, запускает ли Peewee соединение в это время или создает новое соединение, когда ему это нужно (поэтому я использую Peewee, потому что я не хочу иметь дело с этими небольшими деталями). Что вы, мужчины, «комментируете коммит»? – stenci

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