使用Pyramid&中的scoped_session.add()更新数据库。 SQLAlchemy的

时间:2012-12-11 13:17:17

标签: python sqlalchemy pyramid

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

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

1 个答案:

答案 0 :(得分: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()或已在数据库中的函数调用该函数。