2011-06-21 16 views
1

私は現在、Cherrypyアプリケーションの問題に直面しています。 私自身のカスタムセッションモジュールで、session.add()を実行するとき、まったく同じオブジェクトが2回更新されます。Sql Alchemy Duplicated Commit

cherrypy.request.SessionManager.user_data = user 

try: 

    db_session.add(cherrypy.request.SessionManager) 
    db_session.commit() 

2011-06-21 09:16:48,991 INFO sqlalchemy.engine.base.Engine.0x...04cL BEGIN (implicit) 
2011-06-21 09:16:49,015 INFO sqlalchemy.engine.base.Engine.0x...04cL SELECT ..... 
FROM "Clients_Users" 
WHERE "Clients_Users".username = %(username_1)s AND "Clients_Users".password = %(password_1)s 
LIMIT 1 OFFSET 0 
2011-06-21 09:16:49,015 INFO sqlalchemy.engine.base.Engine.0x...04cL {'password_1': '123', 'username_1': u'1'} 
2011-06-21 09:16:49,047 INFO sqlalchemy.engine.base.Engine.0x...04cL UPDATE "SYS_Sessions" SET user_data=%(user_data)s WHERE "SYS_Sessions".id = %(SYS_Sessions_id)s 
2011-06-21 09:16:49,067 INFO sqlalchemy.engine.base.Engine.0x...04cL {'SYS_Sessions_id': 92L, 'user_data': <psycopg2._psycopg.Binary object at 0x8a7c06c>} 
2011-06-21 09:16:49,071 INFO sqlalchemy.engine.base.Engine.0x...04cL COMMIT 
2011-06-21 09:16:49,093 INFO sqlalchemy.engine.base.Engine.0x...04cL BEGIN (implicit) 
2011-06-21 09:16:49,095 INFO sqlalchemy.engine.base.Engine.0x...04cL UPDATE "SYS_Sessions" SET user_data=%(user_data)s WHERE "SYS_Sessions".id = %(SYS_Sessions_id)s 
2011-06-21 09:16:49,095 INFO sqlalchemy.engine.base.Engine.0x...04cL {'SYS_Sessions_id': 92L, 'user_data': <psycopg2._psycopg.Binary object at 0x8a8424c>} 
2011-06-21 09:16:49,108 INFO sqlalchemy.engine.base.Engine.0x...04cL COMMIT 

を返します。誰もが前にこれを見ていますか?

P.Sこれは私が作ったモジュールの残りの部分では起こりません。

答えて

1

[OK]をこのような大きな遅れて申し訳ありませんが、私は休暇中だった。

とにかく、ダブルコミットを防止するには、セッションからオブジェクトを削除し、session.expunge()を使用してオブジェクトを削除する必要があります。

もう1つ。

使用方法session.merge() 消去されたオブジェクトを再利用することができます。

これは、必要としている人に役立ちます。

P.S:オブジェクトが誤動作する可能性があること、または将来の錬金術パッチが互換性を破る可能性があることを考慮してください。

1

セッションにSessionManagerオブジェクト自体を追加するのではなく、セッションにuser_dataを追加することをお勧めします。これにより、少なくともデバッグがより簡単になります。

これは、cherrypyのSessionManager内にデータベースセッションがあるかどうかわかりませんが、望ましくないように見えますが、sqlalchemyが処理できますか(?)またはおそらくオブジェクトに複数の変更を加えていますまったく同じ時間にデータベースで実行されることはありません。たぶん、これはいくつかのカスケードが(?)にエコーで見える方法です。どのようなカスケードの価値を使用していますか?

sqlを2回目に更新しているかどうかわかりません。暗黙的なものにしか見えません。おそらく、これらのオブジェクトのコードの一部、またはより良い答えを得るために更新を引き起こすコードの一部を表示する必要があります。しかし、おそらく上記の直感は助けになるでしょう。幸運