4

如何使用 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”),它会正确添加一个带有我传递给它的值的新行。

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

4

1 回答 1

6

您根本不需要使用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()或数据库中已有的函数调用该函数。

于 2012-12-11T13:19:36.733 回答