【问题标题】:pyramid transaction.manager doesn't update object金字塔 transaction.manager 不更新对象
【发布时间】: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 上调用 classmethodpost = BlogPost.by_slug(slug),然后将其与请求一起传递给视图。

标签: python-3.x transactions sqlalchemy pyramid


【解决方案1】:

为什么你在这里使用事务?
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)

【讨论】:

  • 这种方式也不会发生。帖子没有更新。加上当我尝试创建一个新的Post 时发生了一些奇怪的事情。新创建的帖子(未提交到数据库)每隔三个 GET 请求就会出现在所有帖子的列表中。
【解决方案2】:

显然,问题是,我在pyramid.includes 下没有pyramid_tm ini 配置:

[app:main]
use = egg:myproject

pyramid.includes =
    pyramid_jinja2
    pyramid_tm #this was missing

奇怪的是,我没有看到任何错误或任何东西,而且它有点工作,但让人很头疼。

【讨论】:

    猜你喜欢
    • 2012-05-24
    • 1970-01-01
    • 2019-09-14
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2014-10-05
    相关资源
    最近更新 更多