【初心者向き】flaskでSQLAlchemyの使い方と例を解説

「SQLAlchemyって何?どう使うの?」
「SQLAlchemyでどんないいことがある?注意点は?」

flaskを勉強し始めて、データベースの接続などをやり始めたら、必ずORM、SQLAlchemyなどの単語に当たるのではないかと思います。

この記事では、現役ITコンサルタントがSQLAlchemyとは何なのか、その使い方と最後にはSQLAlchemyを使ったコード例を紹介いたします。

SQLAlchemyを使うことによって、flaskからDBにアクセスすることがとても楽になります。

ぜひ、この機会にSQLAlchemyのことを知り、DBを身に着ける大きな一歩としましょう。

SQLAlchemyって何?

そもそも、SQLAlchemyとは何でしょうか

SQLAlchemyはPythonの「データベースアクセスモジュール」の一つです。

Pythonにはモジュールが多数ありますが、データベースへのアクセスを可能にするモジュールも同様にあります。

このようなデータベースアクセスモジュールのことをORMと言います。(詳しくは後ほど解説します。)

SALAlchemyはその中でも、最も広く使われているORMモジュールと言ってもいいでしょう。

では、ORMについて解説します。

ORMとは?

ORM ( Object-Relational Mapping ) というのは、データベースのレコードとPythonのオブジェクトを関連付け相互に変換する機能を提供します。

簡単に言うと、通常はPythonの中でデータベースの構文を全部書かないといけないところですが、それを単純な構文のみでデータベースを動かせるよ!というPythonとDBの翻訳者の役割を果たしてくれる、ということです。

通常の場合
ORMを使った場合

このように通常はSQL構文を書かないといけないところを、簡単なオブジェクトでDBの操作を可能にできてしまうのです。

では、ORMのメリットデメリットをまとめてみましょう。

ORMのメリット・デメリット

ここでは、ORMを使う上でのメリットとデメリットをまとめました。

ORMのメリット

  1. SQLの理解がなくてもデータベースの操作が可能
  2. プログラム内のDBに関する情報が少なくなる
SQLの理解がなくてもデータベースの操作が可能

データベースにアクセスするためには通常操作したいデータベースの文法に従って書かないといけません。

当然、その分の知識は必要になるでしょう。

しかし、ORMがPython言語をデータベースの言語に翻訳してくれるので、開発者はデータベースの言語を覚える必要がなくなります

初めて、PythonやFlaskを触り、とりあえずデータベースもつなげて形にしたい!という初心者の方には、嬉しいことですね。

プログラム内のDBに関する情報が少なくなる

Pythonのプログラム内に、他の言語(ここではDBの言語)が混じっているというのは、あまり良いことではありません。

他の言語が混じっていることで、バグの温床となったり、不具合の原因となる場合があります。

なので、ORMを用いることで、Python内のDBの言語を減らしリスクを減らすことが可能になります。

ORMのデメリット

  1. データベース(SQL)の知識が乏しくなる
  2. 複雑な要件が表現しにくい
データベース(SQL)の知識が乏しくなる

ORMを使う場合、ORMがPythonで書いたオブジェクトをSQLの構文に書き換えてくれることになります。

なので、必然的にSQLの知識をあまり必要としなくなります

なので、データベースの中で重大な不具合などが起きた場合は、SQLの知識を使って修正を書けないといけないわけですが、その時の対応が難しくなるでしょう。

あべべ

私の感想ですが、初心者の方がこの点を意識することはあまり必要ない気がします。

とりあえずORMでもDBとつなげるということが大事なので、それができてからSQLについては学ぶ、という姿勢で問題ないと思います。

複雑な要件が表現しにくい

ORMによる翻訳となるので、当然ORMが対応している範囲内でのDBの操作しかできません

例えば、「DB①のこの行」と「DB②のこの行」を合わせて一つのテーブルにして、そこからデータを抽出、、みたいな複雑なものはできないわけです。

ORMをうまく使えばできるのかもしれませんが、それではORMの良さが損なわれてしまいます。

ただ、基本的なDBの操作はすべて可能ですので、複雑なDB操作を求めていない人は、気にする必要はないと思います

SQLAlchemyを使うための4つの要素

では、SQLALchemyを使っていきましょう。

ここでは、SQLAlchemyを使うために必要な要素を4つ分解してご説明します

必要なのは以下4つです。

  1. SQLAlchemyをインポート
  2. DBの準備
  3. ORMでDBを操作するクラス作成とDBの生成
  4. データの登録・取得・削除

SQLAlchemyをインポート

まず、始める前にSQLAlchemyをインストールする必要があります。

コードは以下です。

from flask_sqlalchemy import SQLAlchemy

import文に必ず書き加えておきましょう。

DBの準備

接続するDBを選び、準備します。

今回は「SQLite」を用いることにします。

他のDBをつなげたい場合は、ここが参考になると思います。

SQLiteを使う場合以下のように書きます。

#DBの準備
URI = 'sqlite:///note.db'
app.config['SQLALCHEMY_DATABASE_URI'] = URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

ここでは、SQLAlchemyを使うために設定値を格納しています。

'SQLALCHEMY_DATABASE_URI' では、どのデータベースにつなげるかを設定します。

'SQLALCHEMY_TRACK_MODIFICATIONS' では、デバッグモードのON ,OFFを決めます。ここは公式ドキュメントでFalseが推奨されているので、Falseにしておきます。

それらを変数dbに格納しておきます。(あとで使います。)

ORMでDBを操作するクラス作成とDBの生成

クラスを作成

PythonからORMを通してDBを操作するためにクラスを作成します。

作成は以下のようにします。

#ORMでDBを操作するためのクラスを作成
class Note(db.Model):
     __tablename__ = 'notes'
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.String(30))
     body = db.Column(db.String(300))
     date = db.Column(db.DateTime, nullable=False, default=datetime.now())

このNoteクラスを用いて、DBの操作を行っていきます。

__tablename__ では、テーブルの名前を決めます。

classを増やすことで、別のテーブルの作成も可能です。

それ以降では、どんなデータを入れるかのカラム(列)を設定しています。

primarykey = Trueとは、一意のデータを入れる意味となります。またデータベースの検索の際もprimarykey=Trueから検索します。

なお、Integer は数字、String は文字列のことを表しています。

DBの生成

クラスを作った後は、DBを生成するコマンドも作っておきます。

@app.cli.command('initialize_DB')
def initialize_DB():
    db.create_all()

create_all() でdbを作成できます。

コマンドプロンプトで該当ディレクトリに移ってから、以下コマンドを打つとDBが作成されます。

flask initialize_DB

このコマンドを打って試してみたい方は、以下のコードをコピーして試してみましょう。

ちなみに、このコードは先ほど説明した要素をつなげただけです。

コードはこちら
from flask import Flask, render_template
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

#DBの準備
URI = 'sqlite:///note.db'
app.config['SQLALCHEMY_DATABASE_URI'] = URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

#ORMでDBを操作するためのクラスを作成
class Note(db.Model):
     __tablename__ = 'notes'
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.String(30))
     body = db.Column(db.String(300))
     date = db.Column(db.DateTime, nullable=False, default=datetime.now())

@app.cli.command('initialize_DB')
def initialize_DB():
    db.create_all()

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

データの登録・取得・削除

DBに情報を登録・取得・削除するためのルート作成します。

登録

@app.route('/register/<name>/<body>/')
def register(name,body):
      
    #ここで登録    
    register_data = Note(name=name,body=body)
    db.session.add(register_data)
    db.session.commit()
    
    #ここで全データ取得
    all_data = Note.query.all()
    output = []
    for i in all_data:
        output.append([i.id,i.name,i.body,i.date])
    return output

先ほど格納したdb変数を用います。

db.session.addでデータを加えることができます。

db.session.commitで必ず完了させるようにしましょう。

ちなみに、Note.query.all()で全データを取得できます。

今回は、登録状況が見れるよう全件取得しています。

取得

@app.route('/take/<id>')
def take(id):
    data = Note.query.get(id)
    output = [data.id,data.name,data.body,data.date]
    return output

Note.query.get()は引数にprimarykey を指定することで、検索することができます

削除

@app.route('/delete/<id>')
def delete(id):
    #ここで削除
    data = Note.query.get(id)
    db.session.delete(data)
    db.session.commit()
    
    #ここで全データ取得
    all_data = Note.query.all()
    output = []
    for i in all_data:
        output.append([i.id,i.name,i.body,i.date])
    return output

db.session.delete() でNote.query.getで取得した削除したいデータを入れて削除することができます。

全コード

一応全コードを載せておきます。

問題がなければ、そのままコピーして実行すれば動くはずです。

※実行前に、コマンドプロンプトでinitialize_DBを実行するのを忘れずに。

全コードはこちら
from flask import Flask, render_template,jsonify
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)

#DBの準備
URI = 'sqlite:///note.db'
app.config['SQLALCHEMY_DATABASE_URI'] = URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

#ORMでDBを操作するためのクラスを作成
class Note(db.Model):
     __tablename__ = 'notes'
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.String(30))
     body = db.Column(db.String(300))
     date = db.Column(db.DateTime, nullable=False, default=datetime.now())

@app.cli.command('initialize_DB')
def initialize_DB():
    db.create_all()
    
@app.route('/register/<name>/<body>/')
def register(name,body):
      
    #ここで登録    
    register_data = Note(name=name,body=body)
    db.session.add(register_data)
    db.session.commit()
    
    #ここで全データ取得
    all_data = Note.query.all()
    output = []
    for i in all_data:
        output.append([i.id,i.name,i.body,i.date])
    return output

@app.route('/take/<id>')
def take(id):
    #取得
    data = Note.query.get(id)
    output = [data.id,data.name,data.body,data.date]
    return output

@app.route('/delete/<id>')
def delete(id):
    #ここで削除
    data = Note.query.get(id)
    db.session.delete(data)
    db.session.commit()
    
    #ここで全データ取得
    all_data = Note.query.all()
    output = []
    for i in all_data:
        output.append([i.id,i.name,i.body,i.date])
    return output


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

まとめ

今回はSQLAlchemyとは何か、その使い方まで解説いたしました。

初心者にとってデータベースへの接続は大きな一歩となるのでぜひ試してみることをおススメします。

データベースへの接続ができるとログイン機能が実装できるようになります。

以下の記事では、ORMでログイン機能を実装しています。今回のコードをなるべく変えずに引き継いでいますので、ぜひ併せて読んでみてください。

(Visited 39 times, 1 visits today)