この記事では、CRUDについて学んだ後、Flask CRUDアプリケーションを作成します。
CRUDアプリケーションとは?
Webアプリケーションのうち、Create/Retrieve/Update/Deleteの操作を行うものをCRUDアプリケーションと呼びます。
CRUDアプリケーションの典型的な例として、ブログサイトがあります。
ここでは
- Blogを新規に作成することができます。作成
 - 投稿されたブログを見ることができます。取得する
 - ブログを更新する 更新する
 - ブログを削除します。削除
 
CRUDの定義をまとめると、以下のようになります。
| オペレーション|ファンクション
| — | — |
| 作成:新しいデータを作成し、データベースに追加します。
| Retrieve|データベースからデータを取得します。
| 更新(Update): 既存のデータをデータベースに更新します。
| Delete(削除): 既存のデータをデータベースから削除します。
pip install flask_sqlalchemy
 | 
FlaskのCRUDアプリケーションを作成する
社員情報の作成/取得/更新/削除ができるシンプルなFlaskのCRUDアプリケーションを作成します。
したがって、このアプリケーションでは、次のことができます。
- 新しい従業員情報を作成する
 - 従業員のリストを見る。
 - 
- 特定の従業員の情報を見る
 
 - 従業員の情報を更新する
 - 社員情報の削除
 
1. Models.py のコーディング
ここでは、Flask_SQLAlchemyとSQLite DBを使用します。
まず、Flask_SQAlchemyをインストールします。
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class EmployeeModel(db.Model):
    __tablename__ = "table"
    id = db.Column(db.Integer, primary_key=True)
    employee_id = db.Column(db.Integer(),unique = True)
    name = db.Column(db.String())
    age = db.Column(db.Integer())
    position = db.Column(db.String(80))
    def __init__(self, employee_id,name,age,position):
        self.employee_id = employee_id
        self.name = name
        self.age = age
        self.position = position
    def __repr__(self):
        return f"{self.name}:{self.employee_id}"
 | 
models.pyを作成し、以下のコードを追加します。
from flask import Flask
app = Flask(__name__)
app.run(host='localhost', port=5000)
 | 
ここではEmployeeModelを作成しています。
もし構文が理解できない場合は、SQLAlchemyのチュートリアルを参照してください。
2. メインアプリケーションのコーディング
では、メインの Flask Application File をコーディングしてみましょう。
まず、Flask をインポートし、flask app を初期化し、アプリケーションのランタイムの詳細を設定するところから始めます。
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///<db_name>.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.run(host='localhost', port=5000)
 | 
次に、SQLite DB と SQLAlchemy を連携させます。
そこで、以下のコードスニペットを追加します。
from flask import Flask
app =Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///<db_name>.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)@app.before_first_request
def create_table():
    db.create_all()
app.run(host='localhost', port=5000)
 | 
は、DB File の名前に置き換えてください。
また、ユーザーがサーバーにアクセスする前に、(models.py から)DB インスタンスをリンクして、DB ファイルを作成する必要があります。
@app.route('/data/create' , methods = ['GET','POST'])
def create():
    if request.method == 'GET':
        return render_template('createpage.html')
    if request.method == 'POST':
        employee_id = request.form['employee_id']
        name = request.form['name']
        age = request.form['age']
        position = request.form['position']
        employee = EmployeeModel(employee_id=employee_id, name=name, age=age, position = position)
        db.session.add(employee)
        db.session.commit()
        return redirect('/data')
 | 
さて、DBとモデルの準備ができたので、CRUDビューをコーディングしましょう。
この記事もチェック:Flaskのライブラリflask-wtfの使い方|簡単にフォームを作成するよ
3. 作成ビューのコーディング
Create ビューは、以下の機能を備えている必要があります。
- クライアントがこのページにアクセスすると(GET メソッド)、クライアントのデータを取得するためのフォームが表示されます。
 - 送信時(POST メソッド)には、クライアントのデータを EmployeeModel データベースに保存する必要があります。
 
というわけで、Create View は以下のようになります。
<form action='' method = "POST">
  <p>employee ID <input type = "integer" name = "employee_id" /></p>
  <p>name <input type = "text" name = "name" /></p>
  <p>age <input type = "integer" name = "age" /></p>
  <p>position <input type = "text" name = "position" /></p>
  <p><input type = "submit" value = "Submit" /></p>
</form>
 | 
createpage.html には、HTML Form が含まれます。
@app.route('/data')
def RetrieveDataList():
    employees = EmployeeModel.query.all()
    return render_template('datalist.html',employees = employees)
 | 
4. 取得ビューのコーディング
ここでは、2つのビューを用意します。
- 従業員のリストを表示します。
 - 従業員のリストを表示します。 * 単一の従業員の情報を表示します。
 
最初のRetrieveDataListビューは次のようになります。
{% for employee in employees %}
<h3>{{employee}}</h3><hr>
{% endfor %}
 | 
datalist.html ファイルは、従業員のリストを表示します。
@app.route('/data/<int:id>')
def RetrieveSingleEmployee(id):
    employee = EmployeeModel.query.filter_by(employee_id=id).first()
    if employee:
        return render_template('data.html', employee = employee)
    return f"Employee with id ={id} Doenst exist"
 | 
テンプレート言語については、Flask Templateを参照してください。
そして、2つ目のRetrieveSingleEmployeeビューは以下のようになります。
<h3>Id</h3>
<p>{{employee.employee_id}}</p><hr>
<h3>Name</h3>
<p>{{employee.name}}</p><hr>
<h3>Age</h3>
<p>{{employee.age}}</p><hr>
<h3>Position</h3>
<p>{{employee.position}}</p><hr>
 | 
EmployeeModel.query.filter_by(employee_id = id).first() は、DB 内の Employee ID = id を持つ最初の Employee を返し、その ID を持つ Employee が存在しない場合は None を返します。
Data.html には、Employee の情報が表示されます。
@app.route('/data/<int:id>/update',methods = ['GET','POST'])
def update(id):
    employee = EmployeeModel.query.filter_by(employee_id=id).first()
    if request.method == 'POST':
        if employee:
            db.session.delete(employee)
            db.session.commit()
            name = request.form['name']
            age = request.form['age']
            position = request.form['position']
            employee = EmployeeModel(employee_id=id, name=name, age=age, position = position)
            db.session.add(employee)
            db.session.commit()
            return redirect(f'/data/{id}')
        return f"Employee with id = {id} Does nit exist"
    return render_template('update.html', employee = employee)
 | 
5. 更新ビューのコード化
Update View は、DB 内の Employee 詳細情報を、ユーザが送信した新しい情報に更新します。
したがって、Update View は次のようになります。
<form action='' method = "POST">
  <p>name <input type = "text" name = "name" value="{{employee.name}}"/></p>
  <p>age <input type = "integer" name = "age"  value="{{employee.age}}"/></p>
  <p>position <input type = "text" name = "position" value="{{employee.position}}"/></p>
  <p><input type = "submit" value = "Submit" /></p>
</form>
 | 
ユーザはフォームから新しい情報を送信します。
ここでは、まず DB 内の古い情報を削除し、新しい情報を追加します。
update.htmlには、新しい情報を送信するためのフォームが表示されます。
@app.route('/data/<int:id>/delete', methods=['GET','POST'])
def delete(id):
    employee = EmployeeModel.query.filter_by(employee_id=id).first()
    if request.method == 'POST':
        if employee:
            db.session.delete(employee)
            db.session.commit()
            return redirect('/data')
        abort(404)
    return render_template('delete.html')
 | 
6. Delete View のコード化
Delete View は、DB File から Employee 情報を削除するだけです。
Delete View は次のようになります。
<form action='' method="post">
    Click YES to confirm
    <input type = "submit" value="YES">
    <a href='/data'>Cancel</a>
</form>
 | 
delete.html は、削除の再確認を行うだけです。
from flask_sqlalchemy import SQLAlchemy
db =SQLAlchemy()
class EmployeeModel(db.Model):
    __tablename__ = "table"
    id = db.Column(db.Integer, primary_key=True)
    employee_id = db.Column(db.Integer(),unique = True)
    name = db.Column(db.String())
    age = db.Column(db.Integer())
    position = db.Column(db.String(80))
    def __init__(self, employee_id,name,age,position):
        self.employee_id = employee_id
        self.name = name
        self.age = age
        self.position = position
    def __repr__(self):
        return f"{self.name}:{self.employee_id}"
 | 
ユーザがYesを押せば、その社員は削除されます。
そうでなければ、元に戻されます。
CRUDアプリケーションのフルコード
models.py。
from flask import Flask,render_template,request,redirect
from models import db,EmployeeModel
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)@app.before_first_request
def create_table():
    db.create_all()
@app.route('/data/create' , methods = ['GET','POST'])
def create():
    if request.method == 'GET':
        return render_template('createpage.html')
    if request.method == 'POST':
        employee_id = request.form['employee_id']
        name = request.form['name']
        age = request.form['age']
        position = request.form['position']
        employee = EmployeeModel(employee_id=employee_id, name=name, age=age, position = position)
        db.session.add(employee)
        db.session.commit()
        return redirect('/data')
@app.route('/data')
def RetrieveList():
    employees = EmployeeModel.query.all()
    return render_template('datalist.html',employees = employees)
@app.route('/data/<int:id>')
def RetrieveEmployee(id):
    employee = EmployeeModel.query.filter_by(employee_id=id).first()
    if employee:
        return render_template('data.html', employee = employee)
    return f"Employee with id ={id} Doenst exist"
@app.route('/data/<int:id>/update',methods = ['GET','POST'])
def update(id):
    employee = EmployeeModel.query.filter_by(employee_id=id).first()
    if request.method == 'POST':
        if employee:
            db.session.delete(employee)
            db.session.commit()
            name = request.form['name']
            age = request.form['age']
            position = request.form['position']
            employee = EmployeeModel(employee_id=id, name=name, age=age, position = position)
            db.session.add(employee)
            db.session.commit()
            return redirect(f'/data/{id}')
        return f"Employee with id = {id} Does nit exist"
    return render_template('update.html', employee = employee)
@app.route('/data/<int:id>/delete', methods=['GET','POST'])
def delete(id):
    employee = EmployeeModel.query.filter_by(employee_id=id).first()
    if request.method == 'POST':
        if employee:
            db.session.delete(employee)
            db.session.commit()
            return redirect('/data')
        abort(404)
    return render_template('delete.html')
app.run(host='localhost', port=5000)
 | 
メインのFLASKアプリケーションです。

Flask CRUDアプリケーションの実装
サーバーを起動し、”/data/create “に移動します。

ここで詳細を入力し、Submitを押します。
同様に、いくつか追加しています。
“/data “にアクセスします。

1つ目のデータを確認します。
“/data/1 “にアクセスします。

次に、”/data/1/update “に移動して、いくつかの内容を更新します。

詳細が更新されました。
次に、この従業員を削除します。
“/data/1/delete “に移動してください。

はい]を押して、完了です。
この社員は削除されました。
この記事もチェック:Flaskでフォームを実装|ユーザーの入力を受け取る方法などを解説
まとめ
以上です。
以上、Flask の CRUD 操作についてでした。
Flask REST API チュートリアルの Flask REST Framework での CRUD アプリケーションをチェックしてみてください。
では、また次の記事でお会いしましょう