■ 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()