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

时间:2011-12-03 16:58:10

标签: python sql-server sqlalchemy turbogears2

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

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

 DBSession.add(object)
 DBSession.flush()

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

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

1 个答案:

答案 0 :(得分:0)

DBSession.flush()执行SQL,但不提交。您必须致电DBSession.commit()完成交易(在这种情况下无需明确调用flush()commit()会执行此操作。在commit() SQLAlchemy启动新事务之后,这应该不是问题,因为数据通常仅在您执行某些SQL语句时被锁定。