Flask Webアプリケーションで生のSQLを使用してデータベースでCRUD操作を実行するのは、面倒な場合があります。
代わりに、SQLAlchemy、Python Toolkitは強力なORマッパーであり、アプリケーション開発者にSQLの完全な機能と柔軟性を提供します。
Flask-SQLAlchemyは、FlaskアプリケーションにSQLAlchemyのサポートを追加するFlask拡張機能です。
関連コース: Python Flask:Flaskを使用してWebアプリを作成する
ORMとは何ですか?
ORMは、オブジェクトリレーションマッピング(オブジェクトリレーションシップマッピングの略)の略です。
- ほとんどのプログラミング言語プラットフォームはオブジェクト指向です。
- RDBMSサーバーのデータはテーブルに保存されます。
オブジェクトリレーショナルマッピングは、オブジェクトパラメータをレイヤRDBMSテーブルの構造にマッピングする手法です。 ORM APIは、生のSQLステートメントを記述せずにCRUD操作を実行する方法を提供します。
フラスコSQLAlchemy
セットアップ
このセクションでは、Flask-SQLAlchemyのORMテクノロジーを研究し、小さなWebアプリケーションを構築します。
ステップ1 -Flask-SQLAlchemy拡張機能をインストールします。
1
|
pip install flask-sqlalchemy
|
ステップ2 -このモジュールからSQLAlchemyクラスをインポートする必要があります。
1
|
from flask_sqlalchemy import SQLAlchemy
|
ステップ3 -次に、Flaskアプリケーションオブジェクトを作成し、使用するデータベースのURIを設定します。
1 2
|
app = Flask (__name__) app.config ['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'
|
ステップ4 -次に、アプリケーションオブジェクトをパラメーターとして使用して、クラスSQLAlchemyのオブジェクトを作成します。このオブジェクトには、ORM操作の補助関数が含まれています。また、それを使用してユーザー定義モデルを宣言する親モデルクラスも提供されます。コードスニペットで以下に、学生モデルが作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13
|
db = SQLAlchemy(app) class students(db.Model): id = db.Column('student_id', db.Integer, primary_key = True) name = db.Column(db.String(100)) city = db.Column(db.String(50)) addr = db.Column(db.String(200)) pin = db.Column(db.String(10))
def __init__(self, name, city, addr,pin): self.name = name self.city = city self.addr = addr self.pin = pin
|
ステップ5 -URIに記載されているデータベースを作成/使用するには、 create_all()
方法。
CRUD
SQLAlchemyのSessionオブジェクトは、ORMオブジェクトのすべての永続化操作を管理します。
次のセッションメソッドはCRUD操作を実行します。
1 2
|
db.session.add (model object)
|
1 2
|
db.session.delete (model object)
|
filter属性を使用して、取得したレコードセットにフィルタを適用できます。たとえば、学生テーブルのcity = ‘Tokyo’のレコードを取得するには、次のステートメントを使用します。
1
|
students.query.filter_by(city = ’Tokyo’).all()
|
非常に多くの背景があるので、次に、アプリケーションに学生データを追加するための表示機能を提供します。
関連コース: Python Flask:Flaskを使用してWebアプリを作成する
ビュー
すべて表示する
アプリケーションのエントリポイントは、「/」URLにバインドされたshow_all()関数です。学生テーブルのレコードセットは、パラメータとしてHTMLテンプレートに送信されます。テンプレートのサーバー側コードはレコードをレンダリングします。 HTMLテーブルとして。
1 2 3
|
@app.route("https://pythonbasics.org/") def show_all(): return render_template('show_all.html', students = students.query.all() )
|
テンプレートのHTMLスクリプト( ‘show_all.html’)は次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
<!DOCTYPE html> <html lang = "en"> <head></head> <body> <h3> <a href = "{{ url_for('show_all') }}">Comments - Flask SQLAlchemy example</a> </h3> <hr/> {%- for message in get_flashed_messages() %} {{ message }} {%- endfor %} <h3>Students (<a href = "{{ url_for('new') }}">Add Student </a>)</h3> <table> <thead> <tr> <th>Name</th> <th>City</th> <th>Address</th> <th>Pin</th> </tr> </thead> <tbody> {% for student in students %} <tr> <td>{{ student.name }}</td> <td>{{ student.city }}</td> <td>{{ student.addr }}</td> <td>{{ student.pin }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
|
新記録
Webページには、「/ new」URLマッピングnew()関数へのハイパーリンクが含まれています。クリックすると、StudentInformationフォームが開きます。 POSTメソッドでデータが同じURLに公開されます。
new.htmlのビューには次のものが含まれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
<!DOCTYPE html> <html> <body> <h3>Students - Flask SQLAlchemy example</h3> <hr/> {%- for category, message in get_flashed_messages(with_categories = true) %} <div class = "alert alert-danger"> {{ message }} </div> {%- endfor %} <form action = "{{ request.path }}" method = "post"> <label for = "name">Name</label><br> <input type = "text" name = "name" placeholder = "Name" /><br> <label for = "email">City</label><br> <input type = "text" name = "city" placeholder = "city" /><br> <label for = "addr">addr</label><br> <textarea name = "addr" placeholder = "addr"></textarea><br> <label for = "PIN">City</label><br> <input type = "text" name = "pin" placeholder = "pin" /><br> <input type = "submit" value = "Submit" /> </form> </body> </html>
|
役職
httpメソッドがPOSTとして検出されると、フォームデータが学生テーブルに追加され、アプリケーションはデータを追加するディスプレイのホームページに戻ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
@app.route('/new', methods = ['GET', 'POST']) def new(): if request.method == 'POST': if not request.form['name'] or not request.form['city'] or not request.form['addr']: flash('Please enter all the fields', 'error') else: student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin']) db.session.add(student) db.session.commit() flash('Record was successfully added') return redirect(url_for('show_all')) return render_template('new.html')
|
SQLAlchemyの例
アプリケーション(app.py)の完全なコードを以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
from flask import Flask, request, flash, url_for, redirect, render_template from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3' app.config['SECRET_KEY'] = "random string"
db = SQLAlchemy(app)
class students(db.Model): id = db.Column('student_id', db.Integer, primary_key = True) name = db.Column(db.String(100)) city = db.Column(db.String(50)) addr = db.Column(db.String(200)) pin = db.Column(db.String(10))
def __init__(self, name, city, addr,pin): self.name = name self.city = city self.addr = addr self.pin = pin
@app.route("https://pythonbasics.org/") def show_all(): return render_template('show_all.html', students = students.query.all() )
@app.route('/new', methods = ['GET', 'POST']) def new(): if request.method == 'POST': if not request.form['name'] or not request.form['city'] or not request.form['addr']: flash('Please enter all the fields', 'error') else: student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin']) db.session.add(student) db.session.commit() flash('Record was successfully added') return redirect(url_for('show_all')) return render_template('new.html')
if __name__ == '__main__': db.create_all() app.run(debug = True)
|
関連コース: Python Flask:Flaskを使用してWebアプリを作成する