首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Sql Alchemy重复提交

Sql Alchemy重复提交
EN

Stack Overflow用户
提问于 2011-06-21 16:20:38
回答 2查看 1.1K关注 0票数 1

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

代码语言:javascript
运行
复制
cherrypy.request.SessionManager.user_data = user

try:

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

将会返回

代码语言:javascript
运行
复制
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

以前有没有人见过这个?

附注:在我制作的其他模块中,这种情况不会发生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-08 22:54:22

好的,很抱歉让您久等了,但我是去度假的。

无论如何,为了防止双重提交,您需要从会话中删除该对象,您可以使用session.expunge()来做到这一点。

还有一件事。

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

希望这对有需要的人有所帮助。

附言:考虑到一个对象可能行为不端,或者任何未来的炼金术补丁都可能打破compatibility.So的亵渎,这一点是正确的。

票数 1
EN

Stack Overflow用户

发布于 2011-06-21 18:58:40

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6422308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档