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

SQLAlchemy Flask

Eseguire operazioni CRUD su un database in un'applicazione web Flask utilizzando SQL originale può essere noioso. Invece, il kit di strumenti Python SQLAlchemy è un potente mapper OR che fornisce tutte le funzionalità e la flessibilità di SQL agli sviluppatori di applicazioni. Flask-SQLAlchemy è un'estensione Flask che aggiunge il supporto per SQLAlchemy alle applicazioni Flask.

Cos'è ORM (mappatura oggetto-relazionale)?

La maggior parte delle piattaforme di programmazione è orientata agli oggetti. D'altra parte, i dati nei server RDBMS sono memorizzati in tabella. La mappatura oggetto-relazionale è una tecnica che mappa i parametri degli oggetti alla struttura delle tabelle del RDBMS sottostante. L'API ORM fornisce metodi per eseguire operazioni CRUD senza scrivere query SQL originali.

In questa sezione, impareremo a utilizzare la tecnologia ORM di Flask-SQLAlchemy e a costruire una piccola applicazione web.

Passo 1 - Installa l'estensione Flask-SQLAlchemy.

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

Passo 2 - È necessario importare la classe SQLAlchemy da questo modulo.

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

Passo 3 - Ora crea un oggetto applicazione Flask e imposta l'URI del database da utilizzare.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : it.oldtoolbag.com
# Date : 2020-08-08
app = Flask(__name__)
 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'

Passo 4 - Quindi crea un oggetto della classe SQLAlchemy utilizzando l'oggetto applicazione come parametro. L'oggetto contiene funzioni ausiliarie per le operazioni ORM. Fornisce anche una classe di modello superiore per definire modelli utente. Nella seguente porzione di codice, viene creato un modello di studente.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : it.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

Passo 5 - Per creare/usare il database menzionato nell'URI, esegui il metodo create_all().

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : it.oldtoolbag.com
# Date : 2020-08-08
db.create_all()

L'oggetto Sessione di SQLAlchemy gestisce tutte le operazioni di persistenza degli oggetti ORM.

Le seguenti metodologie di sessione eseguono operazioni CRUD -

db.session.add(oggetto modello) - Inserisce un record nel modello mappato db.session.delete(oggetto modello) - Elimina il record dalla tabella model.query.all() - Recupera tutti i record dalla tabella (corrisponde alla query SELECT).

È possibile applicare filtri alla raccolta di record recuperati utilizzando l'attributo filter. Ad esempio, per recuperare i record con city='Haikou' nella tabella students, utilizzare la seguente istruzione -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : it.oldtoolbag.com
# Date : 2020-08-08
Students.query.filter_by(city='Haikou').all()

Con queste conoscenze di base, ora forniremo alla nostra applicazione una funzione di vista per aggiungere dati studenteschi.

Il punto di ingresso dell'applicazione è la funzione show_all() associata all'URL => ‘/’. Il set di record degli studenti viene inviato come parametro al modello HTML. Il codice server-side nel modello viene presentato sotto forma di tabella HTML.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : it.oldtoolbag.com
# Date : 2020-08-08
@app.route('/')
 def show_all():
     return render_template('show_all.html', students = students.query.all())

Script HTML del modello show_all.html) come questo -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : it.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Esempio Flask</title>
 </head>
    <body>
       <h3>
          <a href="{{ url_for('show_all') }}">Elenco studenti - Flask</a> 
             Esempio SQLAlchemy</a>
       </h3>
       <hr/>
       {%- for message in get_flashed_messages() %}
          {{ message }}
       {%- endfor %}
       <h3>Studente (<a href="{{ url_for('new') }}">aggiungi
          </a>)</h3>
       <table>
          <thead>
             <tr>
                <th>Nome</th>
                <th>Città</th>
                <th>Indirizzo</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>

La pagina superiore contiene un collegamento ipertestuale che mappa la funzione new() a URL:/new. Cliccandoci, si apre un modulo di informazioni studentesche. I dati vengono pubblicati alla stessa URL tramite il metodo POST.

File di modello: new.html Il codice è il seguente -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : it.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Esempio Flask</title>
 </head>
    <body>
     <h3>Informazioni studente - Esempio 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">Città</label><br>
          <input type="text" name="city" placeholder="city" /><br>
          <label for="addr">Indirizzo</label><br>
          <textarea name="addr" placeholder="addr" /><br>
          <label for="PIN">Città</label><br>
          <input type="text" name="pin" placeholder="pin" /><br>
          <input type="submit" value="Invia" />
       </form>
    </body>
 </html>

quando si rileva il metodo http POST, i dati del modulo vengono inseriti nella tabella students e l'applicazione torna alla pagina principale che visualizza i dati.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : it.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('Per favore inserisci tutti i campi', 'error')
        else:
           student = students(request.form['name'], request.form['city'],
              request.form['addr'], request.form['pin'])
           db.session.add(student)
           db.session.commit()
           flash('Il record è stato aggiunto con successo')
           return redirect(url_for('show_all'))
     return render_template('new.html')

Di seguito è riportato il codice completo dell'applicazione ( app.py)。

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : it.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('Per favore inserisci tutti i campi', '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('Il record è stato aggiunto con successo')
           return redirect(url_for('show_all'))
     return render_template('new.html')
 if __name__ == '__main__':
     db.create_all()
     app.run(debug=True)

Esegui lo script nel shell di Python e inserisci nell'browser: http://localhost:5000/ , visualizza i risultati come segue -

Clicca su “ AggiungiApri il modulo delle informazioni degli studenti tramite il collegamento.

Compila il modulo e invialo, la pagina principale elencherà i dati inviati. Dopo l'operazione, vedrai l'output come segue.