Python 3.x pyramid transaction.manager不';t更新对象
如何使用金字塔中的transaction.manager更新数据库中的行?以下是我所拥有的: 会议:Python 3.x pyramid transaction.manager不';t更新对象,python-3.x,transactions,sqlalchemy,pyramid,Python 3.x,Transactions,Sqlalchemy,Pyramid,如何使用金字塔中的transaction.manager更新数据库中的行?以下是我所拥有的: 会议: DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 视图: 这就是我从DB获得现有帖子的方式: def by_slug(slug): return DBSession.query(BlogPost).filter(BlogPost.slug == slug).first() 其中,B
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
视图:
这就是我从DB获得现有帖子的方式:
def by_slug(slug):
return DBSession.query(BlogPost).filter(BlogPost.slug == slug).first()
其中,BlogPost
是一个sqlalchemy模型
当我创建一篇新文章时,一切都很好,它被添加并保存在DB中,然而,当我编辑一篇现有的文章时,什么也没有发生。我尝试了
DBSession.flush()
,结果是一样的-我可以创建一个新的帖子,但现有的帖子没有更新。我缺少什么?为什么在这里使用事务?DBSession
上的ZopeTransactionExtension
与项目中处于活动状态的pyramid_tm将为您处理所有提交
那么就试试这个:
def create_update(request, post):
title = request.POST.get('title', None)
content = request.POST.get('content', None)
post.title = title
post.content = content
if post.id is None:
DBSession.add(post)
显然,问题是,我在
pyramid下没有pyramid\u tm
。包括ini
配置中的:
[app:main]
use = egg:myproject
pyramid.includes =
pyramid_jinja2
pyramid_tm #this was missing
奇怪的是,我没有看到任何错误或任何东西,它有点工作,但给人带来了很多麻烦。为什么要显式调用transaction.commit()
?通过使用transaction.manager
作为上下文管理器,代码块完成时已经调用了commit()
。最初我没有它,但联机搜索发现显式调用transaction.commit()
可能会奏效,因此我添加了一个。会话似乎不会跟踪您的过程对象;你是如何得到这个对象的?我只是在BlogPost上调用classmethod
:通过slug(slug)
然后将它与请求一起传递给视图。这样也不会发生任何事情。帖子没有更新。另外,当我尝试创建一个新的帖子时,发生了一些奇怪的事情。每三次GET请求,新创建的post(未提交给DB)就会出现在所有post的列表中。
[app:main]
use = egg:myproject
pyramid.includes =
pyramid_jinja2
pyramid_tm #this was missing