1

我目前在我的 Cherrypy 应用程序中遇到问题。我自己的自定义会话模块,在执行 session.add() 时,完全相同的对象被更新两次。

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

您可以尝试将 user_data 添加到会话中,而不是将 SessionManager 对象本身添加到会话中。这至少会使调试更加直接。

事实上,我不确定你是否在cherrypy SessionManager 中有一个数据库会话——这似乎是不可取的,但也许 sqlalchemy 可以处理它(?)或者可能对无法完成的对象进行多项更改在数据库中完全相同的时间——例如,也许这就是一些级联在 echo on(?) 下的样子。您使用的是什么级联值?

我不确定第二次从读取 sql 中更新了什么。它看起来只是隐含的东西。您可能需要显示这些对象的一些代码或一些导致更新获得更好答案的代码。但也许上述直觉会有所帮助。祝你好运

于 2011-06-21T10:58:40.123 回答
1

好的,抱歉耽搁了这么久,但我正在度假。

无论如何,为了防止双重提交,您需要从会话中删除对象,然后使用session.expunge().

还有一件事 。

使用session.merge() Will 允许您重用已删除的对象。

希望这可以帮助有需要的人。

PS:请记住,一个对象可能行为不端,或者任何未来的炼金术补丁都可能破坏兼容性。所以亵渎是正确的。

于 2011-08-08T14:54:22.493 回答