如何使用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”),它会正确地添加一个新行,其中包含我传递给它的值。
但是,如果该行是现有的,它只是......没有。我希望用新值(即从表单中提取的值)更新行。我怎样才能做到这一点?
答案 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()
或已在数据库中的函数调用该函数。