【Python】Flask入門 データベース SQLite3を使用する

Flask

はじめに

PythonのWEBフレームワークであるであるFlaskと、データベースモジュールであるSQLite3の使用について解説します。なお、解説していく中でクエリ文が出てきますが、SQLite3の使用方法に焦点をあてて解説するので、クエリ文の詳細な解説は省きます。

しげっち
しげっち

Flaskにはデータベースの機能が無いので、データベースを扱う場合にはSQLite3のような外部モジュールを準備する必要があるよ。

にゃーすけ
にゃーすけ

なんでSQLite3なの?

しげっち
しげっち

SQLite3はPythonの標準ライブラリに入っていて、比較的簡単に使用することができるんだ。

Flask学習におすすめの本を紹介します。
⇨【Python】Flask入門におすすめの本 3選

SQLiteとは

SQLiteは軽量で動作が早く、データベース本体が一つのファイルに格納されるので取り扱いが簡単であるのが特徴です。Pythonの標準ライブラリに入っています。現在のバージョンが3であるためSQLite3と記述されたりします。

SQLiteの使い方

SQLiteの使い方についてサンプルを見ていきましょう。

# 0.sqlite3をインポート。これがないと始まらない
import sqlite3
# 1.DB接続。ファイルがなければ作成する
con = sqlite3.connect('TestDB.db')
# 2.テーブル作成
con.execute("CREATE TABLE 商品一覧(コード INTEGER PRIMARY KEY, 商品名 STRING, 値段 REAL)")
# 3.テーブルにデータを追加
con.execute("INSERT INTO 商品一覧(コード, 商品名, 値段) values(1, '苺のショートケーキ', 350)")
con.commit()
# 4.データを更新する
con.execute("UPDATE 商品一覧 SET 値段=450 WHERE コード= 1")
con.commit()
# 5.データ参照
cur = con.execute("SELECT * FROM 商品一覧")
for row in cur:
    print(row)
    print(type(row))
cur.close()
# 5の実行結果
# (1, '苺のショートケーキ', 450.0)
# <class 'tuple'>
# 6.データ削除
con.execute("DELETE FROM 商品一覧")
# 7.テーブル削除
con.execute("DROP TABLE 商品一覧")
# 8.DB接続解除
con.close()

上記サンプルの中で重要な点を補足説明します。
#0のインポートは必須です。前述の通りSQLite3はPythonの標準ライブラリに組み込まれているのでインストールは不要です。
#1でデータベースに接続します。この時データベースを格納するファイルを作成して接続を行います。ファイルが既に存在していれば接続だけ行います。拡張子はdbもしくはsqliteにしましょう。
#5ではfor文で1行ずつデータを取得しています。実行結果の通りタプル型の扱いになります。
データを参照し終えたらクローズします。クローズすることで取得したデータをメモリから開放します。
#8で接続を閉じています。

SQLiteのデータを参照・編集する方法

先程のサンプルでは、Pythonのソースにてデータの参照や編集を行いましたが、テストとしてデータを参照したり加工したい場合に、その度にソースを実行するのは煩わしく感じるかと思います。
Pythonで実行する方法とは別にデータの参照や編集を行う方法について解説します。

しげっち
しげっち

3つの方法を説明するよ。
・ターミナル・コマンドプロンプトで実行する方法
・DB Browser for SQLiteをインストールする方法
・VSCodeの拡張機能を使用する方法

長くなるので別の記事に分けました。

ターミナルで実行する方法

コマンドプロンプトで実行する方法

データを参照・編集できるアプリケーションであるDB Browser for SQLiteをインストールする方法

VSCODEの拡張機能を使用する方法

にゃーすけ
にゃーすけ

おすすめはDB Browserにゃ。テーブルの作成やデータの編集が簡単にできるにゃ。
使っているエディタがVSCODEであれば拡張機能と併用するのも良いにゃ。
実行結果のデータの状態を確認するのにVSCODEだけで完結するにゃ〜。

Flask+SQLiteの使用方法

結論から言うと、FlaskとSQLiteはそれぞれを連携させるための専用の仕組みは用意されていません。
SQLiteで取得したデータをPythonの変数に入れ、それをFlaskに渡すことになります。
または、WEBページで入力した情報をFlaskを通してPythonの変数に渡し、それをSQLiteのデータベースに登録します。

サンプルを見てみましょう。
サンプルのファイル構成は下記のようになります。

.
├── app.py
└── templates
    └── index.html

まずはapp.pyファイルです。

import sqlite3
from flask import Flask,render_template,request,g

app = Flask(__name__)

def get_db():
    if 'db' not in g:
        # データベースをオープンしてFlaskのグローバル変数に保存
        g.db = sqlite3.connect('TestDB.db')
    return g.db

@app.route('/')
def index():

    # データベースを開く
    con = get_db()

    # テーブル「商品一覧」の有無を確認
    cur = con.execute("select count(*) from sqlite_master where TYPE='table' AND name='商品一覧'")

    for row in cur:
        if row[0] == 0:
            # テーブル「商品一覧」がなければ作成する
            cur.execute("CREATE TABLE 商品一覧(コード INTEGER PRIMARY KEY, 商品名 STRING, 値段 REAL)")
            # レコードを作る
            cur.execute(
                """INSERT INTO 商品一覧(コード, 商品名, 値段) 
                values(1, '苺のショートケーキ', 350),
                (2, 'チョコケーキ', 380),
                (3, 'パインケーキ', 380),
                (4, 'バニラアイス', 180),
                (5, 'チョコアイス', 200),
                (6, '紅茶アイス', 180),
                (7, 'りんごのアップルパイ', 250),
                (8, 'ホットコーヒー', 100),
                (9, 'コーラ', 120),
                (10, 'オレンジジュース', 120)
                """)
            con.commit()
    
    # 商品一覧を読み込み
    cur = con.execute("select * from 商品一覧 order by コード")
    data = cur.fetchall()
    con.close()

    return render_template('index.html', data = data)

@app.route('/result', methods=["POST"])
def result_post():
    # テンプレートから新規登録する商品名と値段を取得
    name = request.form["name"]
    price = request.form["price"]

    # データベースを開く
    con = get_db()

    # コードは既に登録されているコードの最大値+1の値で新規登録を行う
    cur = con.execute("select MAX(コード) AS max_code from 商品一覧")
    for row in cur:
        new_code = row[0] + 1
    cur.close()

    # 登録処理
    sql = "INSERT INTO 商品一覧(コード, 商品名, 値段)values({},'{}',{})".format(new_code, name, price)
    con.execute(sql)
    con.commit()

    # 一覧再読み込み
    cur = con.execute("select * from 商品一覧 order by コード")
    data = cur.fetchall()
    con.close()

    return render_template('index.html', data = data)

if __name__ == '__main__':
    app.debug = True
    app.run(host='localhost')




注目する点は、g.db = sqlite3.connect(‘TestDB.db’)の部分です。

ここでFlaskのグローバル変数である「g」にsqlite3の接続情報を取得しています。
「g」は同一のセッションであれば参照可能な変数です。
異なるセッション間の参照はできないようになっています。

続いてindex.htmlを記載してみましょう。

<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <title>商品一覧ページ</title>
</head>
<body>
    <div>
        <table>
            <thead>
                <tr>
                    <th>コード</th>
                    <th>商品名</th>
                    <th>値段</th>
                </tr>
            </thead>
            <tbody>
                {% for item in data %}
                <tr>
                    <th>{{item[0]}}</th>
                    <th>{{item[1]}}</th>
                    <th>{{item[2]}}</th>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>    
    <form action='/result'>
        <p><新規登録></p>
        <label>
            商品名    
            <input type="text" name="name">
        </label>
        <label >
            値段
            <input type="text" name="price">       
        </label>
        <button type="submit" formmethod="POST">登録</button>
    </form>
</body>
</html>

jinjaの機能用いて{% for item in data %}でdata変数の内容を繰り返し取得・表示させています。

実行すると下記のような画面が表示されます。

画面表示デザインが適当なのと、新規登録時の入力チェックを行っていなかったりしますが、このサンプルでFlask⇔Python⇔SQLiteのやり取りが確認できると思います。

まとめ

SQLiteの使用方法とFlaskとの連携について解説しました。

  • Flaskにはデータベースの機能は備わっていないので外部のモジュールを使用する必要がある。
  • SQLiteはPythonの標準モジュールであるため、インストール不要。
  • FlaskとSQLiteはPythonコードを通してデータのやり取りができる。
しげっち
しげっち

最後まで見ていただき、ありがとうございます。

Flask学習におすすめの本を紹介します。
⇨【Python】Flask入門におすすめの本 3選

Flask入門まとめページ

タイトルとURLをコピーしました