1

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

我正在使用 sqlalchemy(通过 turbogears)写入特定的数据库表:

 DBSession.add(object)
 DBSession.flush()

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

DBSession.close()

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

transaction.doom()

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

我在 turbogears 中读到事务管理器(我猜是 repoze.tm)处理提交,但我不知道 - 什么时候调用它?我该如何控制它?尤其是当函数完成它的预定运行时如何删除数据库句柄(我不能只是结束脚本,它是一个 cron 作业,每小时运行一次)。tg2.1 文档对此主题非常不清楚

我还阅读了我应该覆盖 commit_veto 的地方 - 但不明白 - 我应该如何做以及在哪里做?在我的应用程序中我应该在哪里调用 transaction.abort() .doom() 或其他什么?

我也使用事务钩子尝试了相同的功能,但没有成功调用钩子

谢谢你的帮助。

版本数据:

  • 涡轮齿轮箱 2.1.3
  • sqlalchemy 0.7
  • 微软SQL 2005
  • 使用 pyodbc 连接到 mssql
4

1 回答 1

0

DBSession.flush()执行 SQL,但不提交。您必须调用才能完成事务(在这种情况下DBSession.commit()不需要显式调用,会这样做)。SQLAlchemy 启动新事务后,但这应该不是问题,因为数据通常仅在您执行某些 SQL 语句时才被锁定。flush()commit()commit()

于 2011-12-05T15:39:37.497 回答