我目前在我的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以前有没有人见过这个?
附注:在我制作的其他模块中,这种情况不会发生。
发布于 2011-08-08 22:54:22
好的,很抱歉让您久等了,但我是去度假的。
无论如何,为了防止双重提交,您需要从会话中删除该对象,您可以使用session.expunge()来做到这一点。
还有一件事。
使用session.merge()将允许您重用已删除的对象。
希望这对有需要的人有所帮助。
附言:考虑到一个对象可能行为不端,或者任何未来的炼金术补丁都可能打破compatibility.So的亵渎,这一点是正确的。
发布于 2011-06-21 18:58:40
您可以尝试将user_data添加到会话中,而不是将SessionManager对象本身添加到会话中。这至少会使调试变得更加简单。
实际上,我不确定您是否在cherrypy SessionManager中有一个数据库会话--这似乎并不可取,但也许sqlalchemy可以处理它(?)或者,可能正在对对象进行多个更改,而这些更改不能在数据库中完全同时完成--例如,也许这就是某些级联在echo on(?)上的样子。您正在使用的cascade值是什么?
我不确定第二次读取sql时更新的是什么。它看起来只是隐含的东西。您可能需要显示这些对象的一些代码,或者使更新获得更好答案的一些代码。但也许上面的直觉会有所帮助。祝好运
https://stackoverflow.com/questions/6422308
复制相似问题