English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Flask Webアプリケーションで元のSQLを使用してデータベースに対してCRUD操作を行うのは退屈かもしれません。代わりに、PythonパッケージのSQLAlchemyは強力なORマッピングエンジンであり、アプリケーション開発者にSQLの全機能と柔軟性を提供します。-SQLAlchemyはFlask拡張であり、FlaskアプリケーションにSQLAlchemyのサポートを追加します。
ORM(オブジェクト関係マッピング)とは何ですか?
ほとんどのプログラミング言語プラットフォームはオブジェクト指向です。一方、RDBMSサーバー内のデータはテーブル形式で保存されます。オブジェクト関係マッピング(ORM)は、オブジェクトパラメータを下層のRDBMSテーブル構造にマッピングする技術です。ORM APIは、元のSQLステートメントを書かずにCRUD操作を実行する方法を提供します。
このセクションでは、Flaskの使用方法を学びます。-SQLAlchemyのORM技術を使用して小さなWebアプリケーションを構築します。
第1段 - Flaskをインストール-SQLAlchemy拡張。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 pip インストール Flask-sqlalchemy
第2段 - このモジュールからSQLAlchemyクラスをインポートする必要があります。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 from flask_sqlalchemy import SQLAlchemy
第3段 - 今度はFlaskアプリケーションオブジェクトを作成し、使用するデータベースのURIを設定します。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'
第4段 - 次に、アプリケーションオブジェクトをパラメータとして使用してSQLAlchemyクラスのオブジェクトを作成します。このオブジェクトはORM操作のアシスタント関数を含みます。また、宣言されたユーザーモデルの親モデルクラスを提供します。以下のコードスニペットでは、学生モデルを作成します。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 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()メソッドを実行してください。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 db.create_all()
SQLAlchemyのセッションオブジェクトはORMオブジェクトのすべての持続可能な操作を管理します。
以下のセッションメソッドはCRUD操作を実行します -
db.session.add(モデルオブジェクト) - レコードをマッピングテーブルに挿入します db.session.delete(モデルオブジェクト) - テーブルからレコードを削除します model.query.all() - テーブルからすべてのレコードを検索します(SELECTクエリに対応)。
フィルタ属性を使用して検索されたレコードセットにフィルタを適用できます。例えば、studentsテーブルからcity ='Haikou'のレコードを検索するには、以下のステートメントを使用します。 -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 Students.query.filter_by(city = 'Haikou').all()
これらの背景知識を持ちつつ、私たちのアプリケーションに学生データを追加するためのビュー関数を提供します。
アプリケーションのエントリーポイントはURLにバインドされた‘/‘のshow_all()関数。学生のレコードセットはHTMLテンプレートにパラメータとして送信されます。テンプレート内のサーバーサイドコードはHTMLテーブル形式でレコードを表示します。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 @app.route('/) def show_all(): return render_template('show_all.html', students = students.query.all())
テンプレートのHTMLスクリプト( show_all.html)こんな感じで -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Flaskサンプル</title> </head> <body> <h3> <a href = "{{ url_for('show_all') }}">学生リスト - Flask SQLAlchemyサンプル</a> </h3> <hr/> {%- for message in get_flashed_messages() %} {{ message }} {%- endfor %} <h3>学生 (<a href = "{{ url_for('new') }}">追加 </a>)</h3> <table> <thead> <tr> <th>名前</th> <th>都市</th> <th>住所</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>
上のページにはURLへのリンクが含まれています:/new 映射new()関数のリンク。クリックすると、学生情報フォームが開きます。データはPOSTメソッドで同じURLに投稿されます。
テンプレートファイル: new.html のコードは以下の通りです -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Flaskサンプル</title> </head> <body> <h3>学生情報 - Flask SQLAlchemyサンプル</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">名前</label><br> <input type = "text" name = "name" placeholder = "Name" /><br> <label for = "email">都市</label><br> <input type = "text" name = "city" placeholder = "city" /><br> <label for = "addr">住所</label><br> <textarea name = "addr" placeholder = "addr"/><br> <label for = "PIN">都市</label><br> <input type = "text" name = "pin" placeholder = "pin" /><br> <input type = "submit" value = "提交" /> </form> </body> </html>
HTTPメソッドがPOSTであることを検出すると、フォームデータがstudentsテーブルに挿入され、アプリケーションはデータを表示するメインページに戻ります。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 @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('すべてのフィールドを入力してください', 'error') else: student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin']) db.session.add(student) db.session.commit() flash('レコードが正常に追加されました') return redirect(url_for('show_all')) return render_template('new.html')
以下は完全なアプリケーションコードです( app.py)。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 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('/) 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('すべてのフィールドを入力してください', 'error') else: student = students(request.form['name'], request.form['city'],request.form['addr'], request.form['pin']) print(student) db.session.add(student) db.session.commit() flash('レコードが正常に追加されました') return redirect(url_for('show_all')) return render_template('new.html') if __name__ == '__main__': db.create_all() app.run(debug=True)
Python シェルからスクリプトを実行し、ブラウザで以下のURLにアクセスします://localhost:5000/ 」をクリックすると、以下の結果が表示されます。 -
「 追加「リンク」をクリックして、学生情報フォームを開きます。
フォームに情報を入力して送信すると、ホームページが送信したデータを一覧表示します。操作後、以下のようになります。