Flask-SQLAlchemyの基本的な使い方について簡単に紹介します。
公式のチュートリアルとは異なりMySQLを使います。
基本事項
バージョン等
- Python 3.6.0
Flask-SQLAlchemyとは
Flask-SQLAlchemyはFlaskからSQLAIchemyを簡単に使いやすくしたものです。
SQLAlchemyとはかなり簡単に言うとPythonからのDBとのやり取りをかなり簡単に行うためのツールです。
オブジェクト指向とデータベースをうまく繋げるORM(Object-relational mapping)を採用しています。
良くも悪くもSQL文を直接書かないでもDBとやり取りができます。
インストール方法
インストール方法はpipを使えば簡単です。
pip install -U Flask-SQLAlchemy
基本的な操作例
ここでは、基本的なFlask-SQLAlchemyの操作方法を紹介します。
まずは必要なモジュールのimportとFlaskのアプリを初期化します。
# -*- coding: utf-8 -*- from flask import Flask, request from flask_sqlalchemy import SQLAlchemy from sqlalchemy.dialects.mysql import INTEGER, VARCHAR # MySQLのテーブルを作る時に必要 app = Flask(__name__)
データベースへの接続
まずはじめにデータベースに接続します。
# MySQLに接続するための情報 app.config["SQLALCHEMY_DATABASE_URI"] = 'mysql+pymysql://{user}:{password}@{host}/{db_name}?charset=utf8'.format(**{ 'user': "test", 'password': "test_pass", 'host': "localhost", 'db_name': "test_db" }) # おまじない app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False # dbの初期化 db = SQLAlchemy(app)
MySQLの設定は
app.config
のSQLALCHEMY_DATABASE_URIに書いていきます。
app.config
にDBの設定を書いたらSQLAlchemyでDBの初期化をします。
テーブルの作成
テーブルを作成していきます。テーブルはモデルと同様の構成になりますので、Classを定義する要領で指定することができます。以下のコードで定義します。
class Memo(db.Model): """ Memoモデルの定義 """ __tablename__ = "memos" id = db.Column("id", INTEGER(11), primary_key=True) memo = db.Column("memo", VARCHAR(255), nullable=True) # テーブルの生成 db.create_all()
テーブルの変数は db.Column で定義できます。恐らくsqlが多少わかる人であればどのようなテーブルを設定しているかはわかると思います。
Classの定義を終えたら db.create_all() を実行することでDBにテーブルが作成されます。
INSERT:レコードの追加
INSERTの処理を実装します。
Flaskを使うのWebアプリっぽく実装します。
ここでは、POSTリクエストが来たらその値をDBに保存するような処理を書いてみます。
@app.route("/insert", methods=["POST"]) def insert(): # postの受け取り memo_txt = request.form["memo"] # Memoの生成 memo = Memo(memo=memo_txt) # MemoをDBに反映 db.session.add(memo) db.session.commit()
テーブルにレコードを追加する時には、まず先程定義したClassでインスタンスを作成します。
そしてそのインスタンスを db.session.add() にいれることでテーブルに追加できます。
addした後にdbに変更を反映させるために db.session.commit() を行います。これでレコードが追加できました。
試しに上記のコードを試したい場合、ここまでのコード貼り付けて普通に実行してWebサーバーを起動させて、以下のコマンドでPOSTリクエストを送ってください。
curl -d "memo=test_memo" -X POST http://127.0.0.1:5000/insert
SELECT:レコードの取り出し
レコードを取り出してみます。
ここでは、GETリクエストがあればすべてのレコードを返却するようにしてみます。
@app.route("/select", methods=["GET"]) def select(): memos = Memo.query.all() return memos
レコードすべてを取り出す時は簡単でquery.all()を実行すればすべてのレコードを取ってこれます。
良くも悪くもsqlを書かなくても良いので簡単です。
終わりに
今回はFlask-SQLAlchemyの基本的な使い方について紹介しました。
私も初心者なので間違い等があるかもしれません。
もしあれば教えていただければと思います。
参考文献
ゼロからFlaskがよくわかる本: Pythonで作るWebアプリケーション開発入門
https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/
https://study-flask.readthedocs.io/ja/latest/flask_sqlalchemy.html#select