Flask-SQLAlchemy は Flask で SQLAlchemy を簡単に使えるようにする拡張である。データベースへの接続からモデルの定義、CRUD 操作まで一貫して扱える。
セットアップ
pip install flask-sqlalchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
SQLALCHEMY_DATABASE_URI でデータベースの接続先を指定する。SQLite のほか、PostgreSQL や MySQL も使える。
モデルの定義
モデルは db.Model を継承したクラスとして定義する。
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f'<User {self.username}>'
テーブルの作成
定義したモデルからテーブルを作成する。
with app.app_context():
db.create_all()
CRUD 操作
データの作成・読み取り・更新・削除は以下のように行う。
# Create
user = User(username='alice', email='alice@example.com')
db.session.add(user)
db.session.commit()
# Read
user = User.query.filter_by(username='alice').first()
all_users = User.query.all()
# Update
user.email = 'newemail@example.com'
db.session.commit()
# Delete
db.session.delete(user)
db.session.commit()
クエリの例
# 条件検索
users = User.query.filter(User.email.like('%@example.com')).all()
# 並び替え
users = User.query.order_by(User.username).all()
# 件数制限
users = User.query.limit(10).all()
# 1件取得(なければ 404)
user = User.query.get_or_404(1)
リレーションシップ
テーブル間のリレーションを定義できる。
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
author = db.relationship('User', backref='posts')
user.posts でユーザーの投稿一覧を、post.author で投稿者を取得できる。