■ はじめに
https://dk521123.hatenablog.com/entry/2018/09/18/220600
の続き。 今回は、SQLAlchemyを使う
【1】SQLAlchemy とは?
* Alchemy (アルケミー) = 錬金術 * PythonのORM(Object-Relational Mapping)
1)利点
* SQLインジェクションを考慮している
【2】環境設定
# 以下のコマンドを実行
pip install flask-sqlalchemy
【3】サンプル
main.py
#!/usr/bin/env python # -*- coding: UTF-8 -*- from flask import Flask, render_template from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:password@localhost/sample_db?charset=utf8" db = SQLAlchemy(app) class Person(db.Model): __tablename__ = "person" id = db.Column(db.BigInteger, primary_key=True, autoincrement=True) name = db.Column(db.Text()) @app.route("/") def selectAll(): people = Person.query.all() return render_template("sqlalchemy-sample.html", person_vals = people) @app.route("/add/<string:name>") def addNew(name): # データ追加 person = Person() person.name = name db.session.add(person) db.session.commit() people = Person.query.all() return render_template("sqlalchemy-sample.html", person_vals = people) @app.route("/update/<int:id>") def update(id): # データ修正 person = Person.query.get(id) person.name = "Ada" db.session.commit() people = Person.query.all() return render_template("sqlalchemy-sample.html", person_vals = people) @app.route("/delete/<int:id>") def delete(id): # データ削除 person = Person.query.get(id) db.session.delete(person) db.session.commit() people = Person.query.all() return render_template("sqlalchemy-sample.html", person_vals = people) if __name__ == "__main__": app.run() templates/sqlalchemy-sample.html <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Flask - Demo</title> </head> <body> <h1>Sample</h1> {% for person in person_vals: %} <p>[{{ person.id }}] Hello, {{ person.name }}!!!</p> {% endfor %} </body> </html>
実行コマンド
python main.py
動作確認
* ブラウザで以下にアクセスする
* データ追加は、以下。
http://localhost:5000/add/John
* データ修正は、以下。
http://localhost:5000/update/2
* データ削除は、以下。
http://localhost:5000/delete/3
【4】SQLAlchemy あれこれ
1)IDなどで絞り込む
get() を使う
main.py
person = Person.query.get(2) return render_template("sqlalchemy-sample.html", person_val = person) # templates/sqlalchemy-sample.html <p>[{{ person_val.id }}] Hello, {{ person_val.name }}!!!</p>
2)条件を絞る
* filter() を使う
main.py
people = Person.query.filter(Person.id > 2).all()
3)出力データ数を限定する
* limit() を使う
main.py
# 3までデータを出力する people = Person.query.limit(3).all()
関連記事
Flask ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2018/09/11/021900
Flask ~ DB接続 ~
https://dk521123.hatenablog.com/entry/2018/09/18/220600
Flask ~ SQLAlchemy / 基本編 ~
https://dk521123.hatenablog.com/entry/2018/09/23/165130
Python ORM ~ SQLAlchemy / 入門編 ~
https://dk521123.hatenablog.com/entry/2025/10/07/133808
Python ORM ~ SQLAlchemy / 基本編 ~
https://dk521123.hatenablog.com/entry/2025/10/10/013250