コンテンツにスキップ

第6章 データベースとの連携

1 販売管理

データベースを利用するWebサイトを作ります。今回は販売管理をテーマにし、データベースの基本で作成した以下のようなテーブルを使用します。

shouhinテーブル

  • 商品ID sid (整数:Integer) 主キー
  • 商品名 sname (文字列:String 最大255文字)
  • 単価 tanka (整数:Integer)

uriageテーブル

  • 売上ID uid (整数:Integer) 主キー
  • 商品ID sid (整数:Integer)
  • 販売個数 kosu (整数:Integer)
  • 販売日付 hi (日付:Date)

2 データベースの利用

hanbai.py に記述していきます。 まず、これまでと同様に変数appにFlaskオブジェクトを作成します。

from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)

次にデータベースを扱う準備をします。ファイル名を指定し、データベースを扱うライブラリ SQLAlchemy のオブジェクト db を作成します。

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///hanbai.db'
db = SQLAlchemy(app)

そして、商品テーブルを一件入れるためのクラス、Shouhinを 作成します。

class Shouhin(db.Model):
    sid = db.Column(db.Integer, primary_key=True)
    sname = db.Column(db.String(255))
    tanka = db.Column(db.Integer)

    def __init__(self, sname, tanka):
        self.tanka = tanka
        self.sname = sname

次にトップページを作成します。今回のhanbai.pyで扱うテンプレートは templates 配下のhanbaiフォルダ内に入れていきます。トップページは商品一覧を表示します、商品テーブルを全検索し、それをhanbai/slist.htmlで票Jします。

@app.get('/')
def index():
    rows = Shouhin.query.all()
    return render_template('hanbai/slist.html',rows=rows)

最後にFlaskの実行を書きます。

app.run(debug=True)

テンプレート hanbai/slist.htmlでは表形式で全てをfor文で表示します。rowから取り出した r から r.列名 で参照できます。

<table>
    <tr><th>商品ID</th><th>商品名</th><th>単価</th></tr>
    {% for r in rows %}
    <tr>
    <td>{{r.sid}}</td>
    <td>{{r.sname}}</td>
    <td>{{r.tanka}}</td>
    </tr>
    {% endfor %}
</table>

問題

同じ hanbai.py 内にUriageテーブルを定義し(※ db_uriage.pyよりコピー)、 /ulist でアクセスすると uriageテーブルの内容を全て表示する ulist関数を作成しよう。テンプレートは ulist.html を使用する。列名は以下の4つである。

  • 売上ID(uid)
  • 商品ID(sid)
  • 個数(kosu)
  • 日付(hi)

3 データベースとフォーム

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

商品一覧(/slist)の画面、つまり 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 にリダイレクトします。