特定のDB(トランザクションマネージャーの制御)でTurbogears2ハンドルをリリースする

StackOverflow https://stackoverflow.com/questions/8369293

質問

私は2 dBで動作するターボギアーズアプリケーションを構築しています - 2番目のアプリケーション - 私が言及しているのはMSSQL DBです - 別のアプリケーションで使用されます(私のものではありません - 私のアプリケーションは実際には問題を解決するためのハックです - だから私はできます'他のアプリケーションまたはMSSQL DB設定を制御します)

私は次のことを使用して(ターボギアを介して)sqlalchemyを使用して特定のDBテーブルに手紙を書きます。

 DBSession.add(object)
 DBSession.flush()

データはDBに書き込まれますが、TurbogearsアプリケーションはDBの何らかのハンドルを保持しているため、そのDBテーブルを使用したメインアプリケーションはそれから読み取ることができますが、変更できません。 Turbogearsアプリケーションを停止するまで、すべてが機能します。私は電話しようとしました:

DBSession.close()

しかし、その後、データはDBから魔法のように削除されました - おそらくトランザクションロールバックです。私も電話をかけようとしました:

transaction.doom()

似たような効果があります(またはまったく効果がありません私にはわかりません)

Turbogearsでは、トランザクションマネージャー(repoze.tm)がコミットを処理すると思いますが、私は把握できません - いつ呼ばれますか?どうすれば制御できますか?特に、機能が終了したときにDBハンドルを削除する方法は、スケジュールされた実行(スクリプトを終了することはできません。それは1時間ごとに実行される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ステートメントを実行した場合にのみデータがロックされるため、これは問題ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top