【问题标题】:Peewee says "cannot commit - no transaction is active"Peewee 说“无法提交 - 没有交易处于活动状态”
【发布时间】:2014-10-21 09:25:54
【问题描述】:

我的 CherryPy 应用每小时使用以下代码进行一次清理:

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)

【问题讨论】:

标签: python sqlite cherrypy peewee


【解决方案1】:

看起来查询是默认自动提交的。所以尝试将 autocommit 设置为 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

希望这会有所帮助!

【讨论】:

  • 如何不与 Peewee 提交交易?如果是这样,那为什么它一直工作,每 2-3 天失败一次?
  • 嗯,所以大多数提交都准确地更新了数据库中的数据?您的 delete() 是否使用共享数据库连接,或者您是否正在创建一个将自动提交设置为 true 的新连接?您可以注释掉提交并查看您的记录是否被插入或更新?
  • 当应用程序启动时,它会执行db = ... 行,如帖子所示。我不知道 Peewee 是否在那个时候开始了一个连接,或者它是否在需要时创建一个新连接(这就是我使用 Peewee 的原因,因为我不想处理这些小细节)。 “注释掉提交”是什么意思?
  • 每 2/3 天才发生一次任何机会更新、插入和删除?我用你可以尝试的方法更新了我的答案。
  • 每小时删除几条记录。我回头查看日志,注意到函数every_hour 与类似的函数every_day(由另一个监视器执行)同时运行。 every_day 函数在 45 秒的运行期间扫描了一个文件夹并添加了 7 条带有 DbProject.create(number=number, name=name, time_stamp=0) 的记录。这 7 条记录可能在缓慢执行期间的任何时间发生(这就是它们不在一个事务中的原因)。 Monitor 执行的两个函数是否有可能共享同一个事务?我该如何解决?
猜你喜欢
  • 1970-01-01
  • 2012-02-04
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多