【问题标题】:Update database using scoped_session.add() in Pyramid & SQLAlchemy在 Pyramid 和 SQLAlchemy 中使用 scoped_session.add() 更新数据库
【发布时间】:2012-11-29 01:34:50
【问题描述】:

如何使用 add() 更新数据库中的一行?

这是我试过的代码:

@view_config(route_name='doc_user_edit', renderer='doc/edit.mako')
def doc_user_edit(request):
    """ Edit a documentation page. """
    message = ""
    try:
        page = DBSession.query(Page).filter_by(title=request.matchdict['pagename']).first()
    except DBAPIError:
        return Response('An error occured while trying to contact the database', content_type='text/plain', status_int=500)

    if page is None:
        return HTTPNotFound('No such page')

    if 'form.submitted' in request.params:
        page = Page(request.params['title'], request.params['content'], datetime.now())
        DBSession.add(page)
        DBSession.commit()
        message = _('Page edited')

    return {'p':page,
            'm':message,
            'save_url': request.route_url('doc_user_edit', pagename=page.title),
    }  

注意:DBSession 是一个 scoped_session。

如果该行是全新的(即不存在唯一键“title”),它会正确添加一个包含我传递给它的值的新行。

但如果该行是现有行,它只是做......什么都不做。我希望它用新值(即从表单中提取的值)更新行。我怎样才能做到这一点?

【问题讨论】:

  • 您已经确定页面在那里..

标签: python sqlalchemy pyramid


【解决方案1】:

您根本不需要使用add()(它只对新对象是必需的)。只需修改现有的page 对象,然后提交即可。

if 'form.submitted' in request.params:
    page.title = request.params['title']
    page.content = request.params['content']
    page.no_idea_what = datetime.now()
    DBSession.commit()

顺便说一句,除非有充分的理由使用本地时间,否则最好将时间戳存储在 UTC 中。


根据您网站的工作方式,您可能希望组合编辑和创建逻辑。它基本上看起来像这样:

def do_edit_whatever(obj):
    # Populate the fields here
    if obj.id is None:
        db.session.add(obj)
    db.session.commit()

然后您的视图函数将使用新的Page() 或数据库中已有的函数调用该函数。

【讨论】:

  • 哇,就是这么简单...非常感谢!
猜你喜欢
  • 2019-05-11
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2013-04-18
  • 2012-02-05
  • 1970-01-01
  • 2011-02-08
  • 2015-02-06
相关资源
最近更新 更多