2012-03-18 32 views
0

我想學python,我選了金字塔框架。但是,我不想使用sqlalchemy提供的ORM,而是寫純SQL(儘管我仍然使用sqlalchemy)。我也使用khufu_sqlalchemy來設置它。如何在金字塔中插入使用khufu_sqlalchemy

但是,我無法插入到數據庫中。交易正在啓動,但它永遠不會COMMITED ..
我的代碼:

 
    db = dbsession(request) 
    db.execute('insert into users (email, password) values (:email, :password)' , {'email':email, 'password':password})

是否有辦法來自動提交?該文檔非常稀疏..

回答

1

胡夫遵循金字塔慣例使用事務管理器來處理數據庫連接。這意味着代碼(您的sessionmaker初始化中有ZopeTransactionExtension)會掛鉤數據庫會話並跟蹤更改。當檢測到更改時,如果沒有錯誤發生,它們將在請求結束時自動提交。如果繞過ORM並自己調用execute,可以1)關閉事務管理器並自己調用commit 2)在做execute之後將會話標記爲髒,以便連接會認爲事情發生了變化併爲您自動調用commit 。第二種方法是首選,因爲如果您自己提前調用commit,則其餘代碼可能會失敗,但數據仍然保留在數據庫中。要做第二種方法,請使用擴展中的mark_changed函數。

from zope.sqlalchemy import mark_changed 
session = DBSession() 
mark_changed(session) 

作爲一個側面說明,如果你想強迫交易的請求在年底前提交,你可以做到這一點通過

import transaction 
transaction.commit() 

但同樣,這將自動在發生如果沒有錯誤發生,請求結束。