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 です。

行が新しい場合 (つまり、一意のキー「タイトル」が存在しない場合)、渡した値を含む新しい行が正しく追加されます。

しかし、行が既存のものである場合、それは単に...何もしません。行を新しい値 (つまり、フォームから抽出された値) で更新したいと思います。どうすればそれを達成できますか?

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()

ところで、localtime を使用する本当に正当な理由がない限り、タイムスタンプを 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 に答える