前回まで作成した商品データベースページにて、商品情報をディクショナリの配列から読み込んでいましたが、今回はSQLite3から読み込むように作成していきます。
1 2 3 4 5 6 7 8 9 10 11 12 |
instance └── create_db.py (1)・・・ 新規作成 └── itemdb.sqlite3 (2)・・・ 新規作成 web └── itemdb.py (3)・・・ 新規作成 └── __init__.py (4)・・・ 更新 └── items.py (5)・・・ 更新 └── templates | └── base.html | └── index.html └── static └── style.css |
(1)create_db.py
以前、SQLite3について触れたときに作成したソースを使用します。商品情報を5件登録しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import sqlite3 conn = sqlite3.connect('itemdb.sqlite3') c = conn.cursor() c.execute('''CREATE TABLE items (id INTEGER PRIMARY KEY AUTOINCREMENT, item_name TEXT, price INTEGER)''') c.execute('''INSERT INTO items (item_name, price) VALUES('キャベツ', 198)''') c.execute('''INSERT INTO items (item_name, price) VALUES('にんじん', 98)''') c.execute('''INSERT INTO items (item_name, price) VALUES('牛乳', 168)''') c.execute('''INSERT INTO items (item_name, price) VALUES('もやし', 38)''') c.execute('''INSERT INTO items (item_name, price) VALUES('はくさい', 128)''') conn.commit() c.execute("SELECT * FROM items") result = c.fetchall() print(result) conn.close() |
(2)itemdb.sqlite3
以下のようにAndroid pronpt上で「python create_db.py」を実行すると、’itemdb.sqlite3’が作成されます。(ファイル名は(1)の3行目になります。)
(3)itemdb.py
DB操作のための関数を定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import sqlite3 from flask import current_app, g def get_db(): if 'db' not in g: g.db = sqlite3.connect( current_app.config['DATABASE'], detect_types=sqlite3.PARSE_DECLTYPES ) g.db.row_factory = sqlite3.Row return g.db def close_db(e=None): db = g.pop('db', None) if db is not None: db.close() def init_app(app): app.teardown_appcontext(close_db) |
・3行目:’current_app’はアプリケーション本体の情報や設定の為のメソッドを備えたオブジェクトです。’g’はDBの接続情報を保持するディクショナリです。
・5行目:DBより接続情報を取得します。キー’db’に接続情報を与えます。
・15行目:DBを閉じます。
・20行目:古いアプリケーションを破棄し、初期化します。
(4)__init__.py
(3)を呼び出してDBを操作します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from flask import Flask import os def create_app(): app = Flask(__name__) from . import items app.register_blueprint(items.bp) from . import itemdb itemdb.init_app(app) app.config.from_mapping( SECRET_KEY='temp', DATABASE=os.path.join(app.instance_path, 'itemdb.sqlite3'), ) |
・2行目:osをインポート。(後記の相対パスの取得で使用)
・10行目:itemdbモジュールをインポート。
・13行目:’SEACRET_KEY’は暗号化キーを設定します。’DATABASE’にはitems.sqlite3の相対パスを設定します。
(5)items.py
DBの情報を取得して、商品データベースページに表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from flask import ( Blueprint, render_template ) from web.itemdb import get_db bp = Blueprint('items', __name__) @bp.route('/') def index(): db=get_db() alldata = db.execute('SELECT * FROM items').fetchall() return render_template('index.html', items=alldata) |
・5行目:(4)のget_db関数をインポート。
・11行目:DBに接続。
・12行目:itemsの全件を取得して、indexページに返します。
実行結果は以下になります。
flaskの勉強に活用させてもらっています。
情報が多くない中、大変助かっています。
(4)__init__.pyですが、”def create_app():” 内の “return app” が抜けているように思われます。
(少なくとも当方の環境では、これを入れたら “NoAppException” エラーを消すことができました。)