我目前在我的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


有没有人见过这个 ?

附言:这在我制作的其余模块中都不会发生。

最佳答案

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

照原样,我不确定您是否在cherrypy SessionManager中拥有数据库会话,这似乎是不希望的,但也许sqlalchemy可以处理它(?),或者正在对无法完成的对象进行多次更改完全同时在数据库中-例如也许这就是在echo on(?)下一些层叠的样子。您正在使用级联的什么值?

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

关于python - Sqlalchemy重复提交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6422308/

10-12 16:33
查看更多