【Python】Webフレームワーク 「Flask」 ~ SQLAlchemyでMySQLを操作する ~


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

関連記事

PythonMySQLを使う

https://blogs.yahoo.co.jp/dk521123/37744753.html

Webフレームワーク 「Flask」 ~ Hello World編 ~

https://blogs.yahoo.co.jp/dk521123/37736310.html

Webフレームワーク 「Flask」 ~ MySQLを使う ~

https://blogs.yahoo.co.jp/dk521123/37745178.html

Webフレームワーク 「Flask」 ~ SQLAlchemyでテーブルを連結する ~

https://blogs.yahoo.co.jp/dk521123/37746541.html