English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Executar operações CRUD no banco de dados usando SQL original pode ser tedioso no aplicativo web Flask. Em vez disso, o pacote de ferramentas Python SQLAlchemy é um mapeador OR poderoso, que oferece todas as funcionalidades e flexibilidade do SQL para desenvolvedores de aplicativos.-SQLAlchemy é uma extensão do Flask, que adiciona suporte ao SQLAlchemy ao aplicativo Flask.
O que é ORM (mapeamento objeto-relacional)?
A maioria das plataformas de linguagem de programação é orientada a objetos. Por outro lado, os dados armazenados em servidores RDBMS são armazenados em forma de tabela. Mapeamento objeto-relacional é uma técnica que mapeia parâmetros de objetos para a estrutura de tabela do RDBMS subjacente. A API ORM fornece métodos para executar operações CRUD, sem a necessidade de escrever comandos SQL originais.
Nesta seção, vamos aprender a usar Flask-Tecnologia ORM do SQLAlchemy e construa uma pequena aplicação web.
第1步 - Instale Flask-Extensão SQLAlchemy.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : pt.oldtoolbag.com # Date : 2020-08-08 instale pip flask-sqlalchemy
第2步 - 需要从该模块导入SQLAlchemy类。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : pt.oldtoolbag.com # Date : 2020-08-08 from flask_sqlalchemy import SQLAlchemy
第3步 - 现在创建一个Flask应用程序对象并为要使用的数据库设置URI。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : pt.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 : pt.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 : pt.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 : pt.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 : pt.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 : pt.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Exemplo 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>
A página acima contém um link para a URL:/new - link para a função de mapeamento new() do new(). Ao clicar, ele abrirá um formulário de informações de estudantes. Os dados são publicados no mesmo URL pelo método POST.
Arquivo de template: new.html O código é o seguinte -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : pt.oldtoolbag.com # Date : 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Exemplo Flask</title> </head> <body> <h3>Informações de estudantes - Exemplo 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">Nome</label><br> <input type="text" name="name" placeholder="Name"> /><br> <label for="email">Cidade</label><br> <input type="text" name="city" placeholder="city"> /><br> <label for="addr">Endereço</label><br> <textarea name="addr" placeholder="addr">/><br> <label for="PIN">Cidade</label><br> <input type="text" name="pin" placeholder="pin"> /><br> <input type="submit" value="提交"> /> </form> </body> </html>
Quando detectado o método HTTP como POST, os dados do formulário serão inseridos na tabela students e o aplicativo retornará à página principal de exibição de dados.
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : pt.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, preencha todos os 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('Registro foi adicionado com sucesso') return redirect(url_for('show_all')) return render_template('new.html')
A seguir está o código completo da aplicação: app.py)。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : pt.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, preencha todos os 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('Registro foi adicionado com sucesso') return redirect(url_for('show_all')) return render_template('new.html') if __name__ == '__main__': db.create_all() app.run(debug=True)
Execute o script no shell Python e insira no navegador: http://localhost:5/ ” -
Clique em “ Adicionar”Abrir o formulário de informações do aluno através do link.
Preencha o formulário e submeta, a página inicial listará os dados submetidos. Após a operação, você verá a saída conforme mostrado a seguir.