コンテンツにスキップ

6 データベースのCRUD

CRUDとは、Create(作成)、Read(読み込み)、Update(更新)、Delete(削除)のことです。既に商品データベースで読み込み(商品一覧)は作成していますので、残りを作成します。

6.1 データの追加

フォームを利用し、shouhinテーブルに追加する画面を作成します。

商品一覧の画面、つまり slist.html に商品名(sname)と単価(tanka)を入力するフォームを作成しましょう。ボタンを押したら /add にpostで送信します。

<form action="/add" method="post">
    商品名:<input type="text" name="sname"><br>
    単価 :<input type="text" name="tanka"><br>
    <input type="submit" value="追加">
</form>

この送信を受け取る関数を作成します。関数名はaddとします。この関数では、送られてきた商品名と単価を取得し、Shouhinクラスのオブジェクト s を作成します。これを、db.session.add(s) でshouhinテーブルに追加します。db.session.commit()を行うことで結果を確定します。

そして、商品一覧に自動で移動します。これをリダイレクトと言い、redirct(URL)で実行します。

@app.post('/add')
def add():
    s = Shouhin(
        sname=request.form['sname'],
        tanka=request.form['tanka']
    )
    db.session.add(s)
    db.session.commit()
    return redirect('/')

問題:売上の追加

売上一覧ページ ulist.html に売上追加フォームを作成します。 入力するのは商品ID(sid)と個数(kosu)です。ボタンを押すと、/uadd にpostで遷移します。hanbai.pyには関数名 uadd()を作成します。追加後に /ulist にリダイレクトします。

6.2 削除確認画面へのリンク

商品の削除画面を作ります。まず、商品一覧(slist.html)の各商品の削除リンクを作り、そこをクリックすると、削除確認画面に遷移します。そこで削除ボタンを押すと、データが削除され、商品一覧に戻るという流れです。

商品一覧削除確認削除商品一覧

まず、商品一覧から削除確認画面へのリンクを作成します。slist.html を修正し、削除確認画面にリンクを貼ります。削除確認画面は /del/商品ID というURLにします。

<tr>
<td>{{r.sid}}</td>
<td>{{r.sname}}</td>
<td>{{r.tanka}}</td>
<td><a href="/del/{{r.sid}}">削除</a></td>
</tr>

/del/{{r.sid}} とすることで、商品IDが1なら/del/1、2なら/del/2 にリンクを貼ることができます。 これにより、「削除」をクリックするとその商品の削除確認画面が表示されます。

6.3 削除確認画面

次に削除確認画面を作ります。 hanbai.py で /del/商品ID というURLに対し、del_get() 関数に記述します。テンプレートは del.html とします。

@app.get('/del/<sid>')
def del_get(sid):
    row = Shouhin.query.get(sid)
    return render_template('hanbai/del.html', shouhin=row)

sidを受け取って、それを元に商品を検索します。検索はdb.getで行います。商品の検索ができたら、del.htmlにshouhinという名前で渡します。

del.html では、商品ID、商品名、単価を表示します。そして、削除ボタンを押すと、URL /del/商品ID にPOSTで遷移します。

<p>削除しますか?</p>

<form action="/del/{{shouhin.sid}}" method="post" >
<p>商品ID:{{shouhin.sid}}</p>
<p>商品名:{{shouhin.sname}}</p>
<p>単価:{{shouhin.tanka}}</p>

<input type="submit" value="削除">
</form>

6.4 削除処理

hanbai.pyに関数del_postを作成します。sidを受け取り、先ほどと同様にsidで検索を行います。そして、db.session.delete(row)で削除し、commitした後、トップページにリダイレクトします。

@app.post('/del/<sid>')
def del_post(sid):
    row = Shouhin.query.get(sid)
    db.session.delete(row)
    db.session.commit()
    return redirect('/')

問題:売上の削除

売上一覧ページ ulist.html に売上削除確認ページへのリンクを作成します。URLは /udel/売上ID とします。 hanbai.py に udel_get関数を作成し、確認ページ udel.html を表示します(udel.html はdel.htmlをコピーし作成します)。 udel.html では、売上ID、商品ID、個数、日付を表示し、削除ボタンを押すと、/udel/売上ID にPOSTで遷移し、udel_post関数で削除します。

6.5 商品の変更

商品の変更画面を作ります。まず、商品一覧(slist.html)の各商品の変更リンクを作り、そこをクリックすると、各商品の変更入力画面に遷移します。そこで変更箇所を入力し、変更ボタンを押すと、商品が変更され、商品一覧に戻ります。

商品一覧変更入力変更商品一覧

変更入力画面は /update/商品ID というURLにし、update_get() 関数に記述します。テンプレートは update.html とします。 変更は /update/商品ID のPOSTで行うことにし、update_post() 関数に記述します。

まず、slist.html を修正し、変更入力画面にリンクを貼ります。

<tr>
<td>{{r.sid}}</td>
<td>{{r.sname}}</td>
<td>{{r.tanka}}</td>
<td><a href="/del/{{r.sid}}">削除</a></td>
<td><a href="/update/{{r.sid}}">変更</a></td>
</tr>

次に変更入力画面を作ります。まず、hanbai.py にupdate_get関数を作ります。sidを受け取って、それを元に商品を検索し、update.htmlに渡します。

@app.get('/update/<sid>')
def update_get(sid):
    row = Shouhin.query.get(sid)
    return render_template('hanbai/update.html', shouhin=row)

update.html では、商品名、単価をテキストボックスで表示しユーザが変更できるようにします。このとき、value属性で現在の値を表示します。 フォームの送信先URLは /update/商品ID とします。

<form action="/update/{{shouhin.sid}}" method="post" >
    商品名:<input type="text" name="sname" value="{{shouhin.sname}}"><br>
    単価 :<input type="text" name="tanka" value="{{shouhin.tanka}}"><br>
    <input type="submit" value="変更">
</form>

hanbai.pyに関数update_postを作成します。sidで商品を検索した後、フォームから送られた sname、tankaでオブジェクトを更新し、commmitします。最後にトップページにリダイレクトします。

@app.post('/update/<sid>')
def update_post(sid):
    row = Shouhin.query.get(sid)

    row.sname = request.form['sname']
    row.tanka = request.form['tanka']
    db.session.commit()
    return redirect('/')