2011-06-21 51 views
1

我目前在我的Cherrypy應用程序中遇到問題。 當我執行session.add()時,我的自定義會話模塊完全相同的對象被更新兩次。Sql Alchemy重複提交

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 

有沒有人見過這個?

P.S這不會發生在我所做的其他模塊中。

回答

1

好吧,對不起,這麼大的延遲,但我在度假。

無論如何,爲了防止雙重提交,您需要從會話中刪除對象,並使用session.expunge()來完成該操作。

還有一件事。使用session.merge() 將允許您重用已被清除的對象。

希望這可以幫助有需要的人。 P:考慮到一個物體可能行爲不當,或者任何未來的鍊金術補丁都可能破壞兼容性。所以褻瀆是正確的。

1

您可以嘗試將user_data添加到會話中,而不是將SessionManager對象本身添加到會話中。這至少會使調試更直接。

事實上,我不確定在cherrypy SessionManager中是否有數據庫會話 - 這似乎是不可取的,但也許sqlalchemy可以處理它(?)或者可能對對象進行多項更改不會在數據庫中完全同時完成 - 例如也許這就是一些級聯在(?)上回顯的方式。你使用什麼級聯值?

我不確定第二次讀取sql時正在更新什麼。它看起來只是一些隱含的東西。您可能需要顯示這些對象的一些代碼或某些導致更新得到更好答案的代碼。但是,也許上述直覺會有所幫助。祝你好運