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

SQLAlchemy Flask

Il peut être ennuyeux d'exécuter des opérations CRUD sur une base de données dans une application web Flask en utilisant des requêtes SQL originales. Au lieu de cela, le kit d'outils Python SQLAlchemy est un mapper ORM puissant qui offre toutes les fonctionnalités et la flexibilité de SQL aux développeurs d'applications. Flask-SQLAlchemy est une extension de Flask qui ajoute le support de SQLAlchemy aux applications Flask.

Qu'est-ce que l'ORM (mappage objet-relationnel) ?

La plupart des plateformes de langage de programmation sont orientées objet. D'autre part, les données stockées dans les serveurs RDBMS sont sous forme de tables. La mappage objet-relationnel est une technique qui mappe les paramètres des objets sur la structure de tables du RDBMS sous-jacent. L'API ORM fournit des méthodes pour effectuer des opérations CRUD sans écrire de requêtes SQL originales.

Dans cette section, nous allons apprendre à utiliser Flask-Utiliser la technologie ORM de SQLAlchemy pour construire une petite application web.

第1步 - Installer Flask-Extension de SQLAlchemy.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
pip install flask-sqlalchemy

第2步 - 需要从该模块导入SQLAlchemy类。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
from flask_sqlalchemy import SQLAlchemy

第3步 - 现在创建一个Flask应用程序对象并为要使用的数据库设置URI。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.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 : fr.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 : fr.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 : fr.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 : fr.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 : fr.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Exemple de 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>地址</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>

La page ci-dessus contient un lien vers l'URL:/new lien hypertexte vers la fonction new() de new(). Après clic, il ouvre un formulaire d'informations sur les étudiants. Les données sont publiées à la même URL via la méthode POST.

Fichier de modèle: new.html du code suivant -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Exemple de Flask</title>
 </head>
    <body>
     <h3>Informations sur les étudiants - Exemple 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">姓名</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>

Lorsque la méthode HTTP est POST, les données du formulaire sont insérées dans la table students et l'application retourne à la page principale affichant les données.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.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('Veuillez remplir tous les champs', 'error')
        else:
           student = students(request.form['name'], request.form['city'],
              request.form['addr'], request.form['pin'])
           db.session.add(student)
           db.session.commit()
           flash('L'enregistrement a été ajouté avec succès')
           return redirect(url_for('show_all'))
     return render_template('new.html')

以下给出的是完整的应用程序代码( app.py)。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.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('Veuillez remplir tous les champs', '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('L'enregistrement a été ajouté avec succès')
           return redirect(url_for('show_all'))
     return render_template('new.html')
 if __name__ == '__main__':
     db.create_all()
     app.run(debug=True)

Exécutez le script à partir de l'invite Python et entrez dans le navigateur: http://localhost:5000/ ,le résultat est affiché comme suit -

Cliquez sur " AjouterOuvrez le formulaire des informations sur les étudiants via le lien "

Remplissez le formulaire et soumettez-le, la page d'accueil listera les données soumises. Après l'opération, vous verrez le résultat suivant.