■ SQLAlchemy とは?
* Alchemy (アルケミー) = 錬金術 * PythonのORM(Object-Relational Mapping)
利点
* SQLインジェクションを考慮している
環境設定
# 以下のコマンドを実行 pip install flask-sqlalchemy
■ サンプル
* データベース、テーブル、データは、以下の関連記事で使用したものと同じhttps://blogs.yahoo.co.jp/dk521123/37744753.html
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]]
* データ追加は、以下。[[http://localhost:5000/add/John]]
* データ修正は、以下。[[http://localhost:5000/update/2]]
* データ削除は、以下。[[http://localhost:5000/delete/3]]
■ SQLAlchemy あれこれ
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>
条件を絞る
filter() を使うpeople = Person.query.filter(Person.id > 2).all()
出力データ数を限定する
limit() を使う# 3までデータを出力する people = Person.query.limit(3).all()