第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 にリダイレクトします。