在特定的DB上释放turbogears2句柄(控制事务管理器)



我正在构建一个与2db一起工作的turbogears应用程序-第二个-我指的是一个mssql数据库-由另一个应用程序使用(不是我的-我的应用程序实际上是一个解决问题的hack -所以我不能控制其他应用程序或mssql数据库设置)

我正在用sqlalchemy(通过turbogears)写一个特定的db表,使用:

 DBSession.add(object)
 DBSession.flush()

数据被写入db -但是turbogears应用程序保留了对db的某种句柄,因此使用该db表的主应用程序可以从中读取但不能更改它。直到我停止涡轮齿轮程序,然后一切正常。我试着打电话:

DBSession.close()

,但随后数据被神奇地从数据库中删除——可能是事务回滚。我也试着打电话给:

transaction.doom()

有类似的效果(或者根本没有效果,我不确定)

我读到在turbogears中,事务管理器(我猜是repoze.tm)处理提交但是我想不起来——它叫什么时候?我如何控制它?特别是如何删除db句柄当函数完成它的计划运行(我不能只是结束脚本,这是一个cron作业,每小时运行一次)。tg2.1文档对这个主题非常不清楚

我还在某处读到我应该推翻commit_veto——但不明白——我应该怎么做,在哪里做?在我的应用程序中,我应该调用transaction.abort() .doom()或其他什么?

我也尝试了使用事务钩子的相同函数,但实际上没有成功调用钩子

谢谢你的帮助。

版本数据:

  • turbogears 2.1.3
  • sqlalchemy 0.7
  • mssql 2005
  • 使用pyodbc连接mssql

DBSession.flush()执行SQL,但不提交。您必须调用DBSession.commit()来完成事务(在这种情况下不需要显式调用flush(), commit()将完成它)。在commit()之后,SQLAlchemy启动了一个新的事务,但这应该不是一个问题,因为数据通常只有在执行一些SQL语句时才被锁定。

最新更新