Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x pyramid transaction.manager不';t更新对象_Python 3.x_Transactions_Sqlalchemy_Pyramid - Fatal编程技术网

Python 3.x pyramid transaction.manager不';t更新对象

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

如何使用金字塔中的transaction.manager更新数据库中的行?以下是我所拥有的:

会议:

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