【发布时间】:2014-01-17 08:09:29
【问题描述】:
如何使用 Pyramid 中的 transaction.manager 更新 DB 中的一行?这是我所拥有的:
数据库会话:
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
查看:
def create_update(request, post):
title = request.POST.get('title', None)
content = request.POST.get('content', None)
post.title = title
post.content = content
with transaction.manager:
if post.id is None:
DBSession.add(post)
transaction.commit()
这就是我从 DB 获取现有帖子的方式:
def by_slug(slug):
return DBSession.query(BlogPost).filter(BlogPost.slug == slug).first()
BlogPost 是一个 sqlalchemy 模型。
当我创建一个新帖子时,一切都很好,它被添加并保存在数据库中,但是当我编辑现有帖子时没有任何反应。我试过DBSession.flush(),结果是一样的——我可以创建一个新帖子,但现有的帖子没有更新。我错过了什么?
【问题讨论】:
-
你为什么要明确地调用
transaction.commit()?通过使用transaction.manager作为上下文管理器,commit()在代码块完成时已经被调用。 -
一开始我没有,但在网上搜索发现显式调用
transaction.commit()可能会成功,因此我添加了。 -
会话似乎没有跟踪您的
process对象;你是怎么得到那个对象的? -
我只是在 BlogPost 上调用
classmethod:post = BlogPost.by_slug(slug),然后将其与请求一起传递给视图。
标签: python-3.x transactions sqlalchemy pyramid