Python 如何使用胡夫炼金术插入金字塔
我正在努力学习python,我选择了金字塔框架。然而,我不想使用sqlalchemy提供的ORM,而是编写纯sql(尽管我仍然在使用sqlalchemy)。我也在使用胡夫炼金术来建立它 但是,我无法向数据库中插入。事务正在启动,但从未提交。Python 如何使用胡夫炼金术插入金字塔,python,pyramid,Python,Pyramid,我正在努力学习python,我选择了金字塔框架。然而,我不想使用sqlalchemy提供的ORM,而是编写纯sql(尽管我仍然在使用sqlalchemy)。我也在使用胡夫炼金术来建立它 但是,我无法向数据库中插入。事务正在启动,但从未提交。 我的代码: db = dbsession(request) db.execute('insert into users (email, password) values (:email, :password)' , {'email':email, '
我的代码: db = dbsession(request) db.execute('insert into users (email, password) values (:email, :password)' , {'email':email, 'password':password}) db=dbsession(请求) execute('insert-into-users(email,password)值(:email,:password),{'email':email,'password':password}) 有办法自动提交吗?文档非常稀少。
这就是你要找的。查看有关自动提交的更多文档。khufu遵循使用事务管理器处理数据库连接的金字塔实践。这意味着在sessionmaker初始化中有一段代码(
ZopeTransactionExtension
)钩住数据库会话并跟踪更改。当检测到更改时,如果没有错误发生,则会在请求结束时自动提交更改。如果您绕过ORM并调用execute yourself,您可以1)关闭事务管理器并调用commit yourself,或者2)在执行execute
后将会话标记为dirty,这样连接将认为内容已更改,并为您自动调用commit。第二种方法是首选的,因为如果您自己过早地调用commit,那么代码的其余部分可能会失败,但数据仍然会保留在数据库中。要执行第二种方法,请使用扩展插件中的mark_changed
功能
from zope.sqlalchemy import mark_changed
session = DBSession()
mark_changed(session)
作为补充说明,如果您确实希望在请求结束之前强制提交事务,则可以通过
import transaction
transaction.commit()
但是,如果没有错误发生,这将在请求结束时自动发生。如果使用事务扩展,这将不起作用。它将导致异常,因为事务管理器正在为您处理提交。
import transaction
transaction.commit()