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

Jul*_*nay 4 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),
    }  
Run Code Online (Sandbox Code Playgroud)

注意:DBSession是一个scoped_session.

如果该行是全新的(即不存在唯一键"title"),则它会正确地添加一个新行,其中包含我传递给它的值.

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

Thi*_*ter 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()
Run Code Online (Sandbox Code Playgroud)

顺便说一下,除非有充分理由使用本地时间,否则最好以UTC格式存储时间戳.


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

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

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