English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLAlchemy Flask

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.