English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ejecutar operaciones CRUD en la base de datos utilizando SQL original en una aplicación web Flask puede ser aburrido. Por el contrario, el paquete de herramientas Python SQLAlchemy es un mapeador OR potente que proporciona a los desarrolladores de aplicaciones todas las funciones y flexibilidad de SQL. Flask-SQLAlchemy es una extensión de Flask que agrega soporte para SQLAlchemy a la aplicación Flask.
¿Qué es ORM (mapeo objeto-relacional)?
La mayoría de las plataformas de programación son orientadas a objetos. Por otro lado, los datos en los servidores RDBMS se almacenan en forma de tablas. La mapeo objeto-relacional es una técnica que mapea los parámetros de los objetos a la estructura de tablas del RDBMS subyacente. La API ORM proporciona métodos para ejecutar operaciones CRUD sin escribir sentencias SQL originales.
En esta sección, aprenderemos a usar Flask-Tecnología ORM de SQLAlchemy y construir una pequeña aplicación web.
第1步 - Instalar Flask-Extensión SQLAlchemy.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : es.oldtoolbag.com # Date : 2020-08-08 instalar pip flask-sqlalchemy
第2步 - 需要从该模块导入SQLAlchemy类。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : es.oldtoolbag.com # Date : 2020-08-08 from flask_sqlalchemy import SQLAlchemy
第3步 - 现在创建一个Flask应用程序对象并为要使用的数据库设置URI。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : es.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 : es.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 : es.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 : es.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 : es.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 : es.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Flask ejemplo</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> </tr> {% endfor %} </tbody> </table> </body> </html>
La página superior contiene un enlace hacia la URL:/new Mapear la función new() de enlace. Al hacer clic, abrirá un formulario de información de estudiante. Los datos se publican en el mismo URL mediante el método POST.
Archivo de plantilla: new.html El código es el siguiente -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : es.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Flask ejemplo</title> </head> <body> <h3>Información de estudiante - Ejemplo de 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">Nombre</label><br> <input type="text" name="name" placeholder="Name"> /><br> <label for="email">Ciudad</label><br> <input type="text" name="city" placeholder="city"> /><br> <label for="addr">Dirección</label><br> <textarea name="addr" placeholder="addr">/><br> <label for="PIN">Ciudad</label><br> <input type="text" name="pin" placeholder="pin"> /><br> <input type="submit" value="提交"> /> </form> </body> </html>
Cuando se detecta el método http como POST, los datos del formulario se insertarán en la tabla students y la aplicación volverá a la página principal que muestra los datos.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : es.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('Por favor, complete todos los campos', 'error') else: student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin']) db.session.add(student) db.session.commit() flash('El registro se agregó con éxito') return redirect(url_for('show_all')) return render_template('new.html')
A continuación se presenta el código completo de la aplicación ( app.py)。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : es.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('Por favor, complete todos los campos', '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('El registro se agregó con éxito') return redirect(url_for('show_all')) return render_template('new.html') if __name__ == '__main__': db.create_all() app.run(debug=True)
Ejecute el script en el shell de Python y escriba: http://localhost:5000/ ”, se mostrarán los resultados como se muestra a continuación -
Haga clic en “ Agregar”Abrir el formulario de información del estudiante mediante el enlace.
Complete el formulario y envíelo, la página principal listará los datos enviados. Después de la operación, verá la salida como se muestra a continuación.