1

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

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

誰もこれを見たことがありますか?

PS これは、私が作成した残りのモジュールでは発生しません。

4

2 に答える 2

1

わかりました、大変遅れて申し訳ありませんが、私は休暇中でした。

とにかく、二重コミットを防ぐには、セッションからオブジェクトを削除する必要があり、session.expunge().

もう一つ 。

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

これが困っている人に役立つことを願っています。

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

于 2011-08-08T14:54:22.493 に答える
1

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

そのままでは、cherrypy SessionManager 内にデータベース セッションがあるかどうかはわかりません。これは望ましくないと思われますが、sqlalchemy で処理できる可能性があります (?) または、オブジェクトに複数の変更を加えている可能性があります。データベース内でまったく同時に--たとえば、エコー オン(?) で一部のカスケードがどのように見えるかなどです。カスケードのどの値を使用していますか?

SQLを読んでから2回目に何が更新されているのかわかりません。暗黙的なものにしか見えません。おそらく、これらのオブジェクトのコードの一部、または更新でより適切な回答を得るコードの一部を示す必要があります。しかし、おそらく上記の直感が役立つでしょう。幸運を

于 2011-06-21T10:58:40.123 に答える