Python Peewee说:“我不知道;无法提交-没有活动的事务";
我的CherryPy应用程序每小时进行一次清洁,代码如下:Python Peewee说:“我不知道;无法提交-没有活动的事务";,python,sqlite,cherrypy,peewee,Python,Sqlite,Cherrypy,Peewee,我的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)
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()
这篇文章和其他人讨论了如何在直接使用sqlite时解决问题,但我使用的是Peewee,我不知道我是否在使用Peewee时出错,或者它是一个bug,我需要解决它
我通过以下方式启动连接:
db = peewee.SqliteDatabase(path_name + '/doc.db', check_same_thread=False)
看起来查询在默认情况下是自动提交的。因此,请尝试将自动提交设置为False
db = peewee.SqliteDatabase(path_name + '/doc.db', check_same_thread=False)
db.set_autocommit(False)
希望这有帮助 如何不使用Peewee提交事务?如果是这样的话,那么为什么它总是工作,并且每2-3天失败一次呢?嗯,那么大多数提交都在准确地更新数据库中的数据?您的delete()是使用共享数据库连接,还是正在创建一个新连接,并将auto commit设置为true?你能注释掉提交,看看你的记录是否被插入或更新吗?当应用程序启动时,它会执行
db=…
行,如帖子所示。我不知道Peewee是在那个时候启动连接,还是在需要时创建新连接(这就是为什么我使用Peewee,因为我不想处理这些小细节)。你认为“注释掉提交”是什么意思?任何更新、插入和删除都是每2/3天发生一次吗?我用一些你可以尝试的东西更新了我的答案。每小时都会删除一些记录。我回头看了一下日志,发现函数每小时运行一次
与类似的函数每一天运行一次(由另一个监视器执行)。every\u day
函数在45秒的运行期间扫描一个文件夹,并使用DbProject.create(number=number,name=name,time\u stamp=0)添加7条记录。这7条记录可能在执行缓慢的过程中随时发生(这就是为什么它们不在一个事务中)。Monitor
执行的两个函数是否可能共享同一事务?我该如何解决这个问题?答案如下:
db = peewee.SqliteDatabase(path_name + '/doc.db', check_same_thread=False)
db.set_autocommit(False)