English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
CRUD-Operationen an der Datenbank mit ursprünglichem SQL in einer Flask-Webanwendung auszuführen, kann langweilig sein. Stattdessen bietet das Python-Paket SQLAlchemy eine leistungsstarke OR-Mapper, der Entwicklern alle Funktionen und Flexibilitäten von SQL zur Verfügung stellt. Flask-SQLAlchemy ist eine Flask-Erweiterung, die die Unterstützung für SQLAlchemy in die Flask-Anwendung hinzufügt.
Was ist ORM (Objekt-Relationale Abbildung)?
Die meisten Programmiersprachplattformen sind objektorientiert. Andererseits werden Daten in RDBMS-Servern in Tabellenform gespeichert. Eine Objekt-Relationale Abbildung (ORM) ist eine Technologie, die Objektattribute auf die zugrunde liegende RDBMS-Tabelle abbildet. Die ORM-API bietet Methoden zur Ausführung von CRUD-Operationen, ohne dass ursprüngliche SQL-Anweisungen geschrieben werden müssen.
In diesem Abschnitt werden wir lernen, wie man Flask verwendet-SQLAlchemys ORM-Technik und die Erstellung einer kleinen Webanwendung.
第1步 - Flask installieren-SQLAlchemy-Erweiterung.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : de.oldtoolbag.com # Date : 2020-08-08 pip install flask-sqlalchemy
第2步 - 需要从该模块导入SQLAlchemy类。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : de.oldtoolbag.com # Date : 2020-08-08 from flask_sqlalchemy import SQLAlchemy
第3步 - 现在创建一个Flask应用程序对象并为要使用的数据库设置URI。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : de.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 : de.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 : de.oldtoolbag.com # Date : 2020-08-08 db.create_all()
SQLAlchemy的Session对象管理ORM对象的所有持久性操作。
以下会话方法执行CRUD操作 -
db.session.add(模型对象) - 将一条记录插入到映射表中 db.session.delete(模型对象) - 从表中删除记录 model.query.all() - 从表中检索所有记录(对应于SELECT查询)。
可以使用filter属性将筛选器应用于检索到的记录集。例如,要在students表中检索city = 'Haikou'的记录,请使用以下语句 -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : de.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 : de.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 : de.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Flask Beispiel</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>地址</th>/th> <th>Pin</th>/th> </tr> </thead> <tbody> {% for student in students %} <tr> <td>{{ student.name }}</td>/td> <td>{{ student.city }}</td>/td> <td>{{ student.addr }}</td>/td> <td>{{ student.pin }}</td>/td> </tr> {% endfor %} </tbody> </table> </body> </html>
Die obige Seite enthält einen Link zur URL:/new() Funktion hyperlink mapping. Nach dem Klicken öffnet es ein Studentendatenformular. Die Daten werden im POST-Verfahren auf die gleiche URL veröffentlicht.
Template-Datei: new.html entsprechende Code -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : de.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Flask Beispiel</title> </head> <body> <h3>Studentendaten - Flask SQLAlchemy Beispiel</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>
Wenn die http-Methode POST erkannt wird, werden die Formulardaten in die Tabelle students eingefügt und die Anwendung kehrt zur Hauptseite zur Anzeige der Daten zurück.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : de.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('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')
Nachstehend wird der vollständige Anwendungscode gegeben ( app.py)。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : de.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('Please enter all the fields', '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('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)
Führen Sie das Skript im Python-Shell aus und geben Sie im Browser ein: http://localhost:5/ ” -
Klicken Sie auf “ HinzufügenÖffnen Sie das Formular für die Schülerinformationen über den Link
Füllen Sie das Formular aus und senden Sie es ein. Die Homepage listet die übermittelten Daten auf. Nach der Operation sehen Sie wie folgt aus.