Flask と SQLAlchemy で CRUD 操作を実装する

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 で投稿者を取得できる。