大白話說Python+Flask入門(六)Flask SQLAlchemy操作mysql資料庫

2023-12-07 06:00:47

寫在前面

這篇文章被擱置真的太久了,不知不覺拖到了週三了,當然,也算跟falsk系列說再見的時候,真沒什麼好神祕的,就是個資料庫操作,就大家都知道的CRUD吧。

Flask SQLAlchemy的使用

1、Flask SQLAlchemy簡介

Flask SQLAlchemy 是基於 Flask web 框架和 SQLAlchemy ORM(物件關係對映)的工具。它旨在為 Flask web 應用程式提供更方便的資料庫操作。SQLAlchemy 本身是一個全功能的 ORM,而 Flask-SQLAlchemy 是在此基礎上為 Flask 應用程式提供了一些額外的功能。

2、安裝Flask-SQLAlchemy

pip install flask-sqlalchemy

3、舉個栗子

後端業務程式碼如下:

import pymysql
from flask import Flask, request, flash, url_for, redirect, render_template
from flask_sqlalchemy import SQLAlchemy

from flask_case.config import Config

pymysql.install_as_MySQLdb()

# 範例化一個flask物件
app = Flask(__name__)
# 設定一個金鑰
app.secret_key = 'a_secret_key'
# 從設定物件中載入設定資訊
app.config.from_object(Config)
# 建立SQLAlchemy物件
db = SQLAlchemy(app)

class books(db.Model):
    id = db.Column('student_id', db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    price = db.Column(db.String(50))

    def __init__(self, name, price):
        self.name = name
        self.price = price





@app.route('/')
def show_all():
    return render_template('show_all.html', books=books.query.all())


@app.route('/add', methods=['GET', 'POST'])
def add():
    if request.method == 'POST':
        if not request.form['name'] or not request.form['price']:
            flash('輸入項不能為空!', 'error')
        else:
            book = books(request.form['name'], request.form['price'])
            print(book)
            db.session.add(book)
            db.session.commit()
            flash('新書上架成功!')
            return redirect(url_for('show_all'))
    return render_template('add.html')


if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True)

新增書頁面add.html,範例程式碼如下:

<!DOCTYPE html>
<html>
   <body>

      <h3>Flask SQLAlchemy Demo</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">name</label><br>
         <input type = "text" name = "name" placeholder = "name" /><br>
         <label for = "price">price</label><br>
         <input type = "text" name = "price" placeholder = "price" /><br>
         <input type = "submit" value = "Submit" />
      </form>

   </body>
</html>

書單列表頁show_all.html,範例程式碼如下:

<!DOCTYPE html>
<html lang = "en">
   <head></head>
   <body>
      
      <h3>
         <a href = "{{ url_for('show_all') }}">Flask
            SQLAlchemy Demo</a>
      </h3>
      
      <hr/>
      {%- for message in get_flashed_messages() %}
         {{ message }}
      {%- endfor %}
       
      <h3>Books (<a href = "{{ url_for('add') }}">Add Book
         </a>)</h3>
      
      <table>
         <thead>
            <tr>
               <th>name</th>
               <th>price</th>
            </tr>
         </thead>
         
         <tbody>
            {% for book in books %}
               <tr>
                  <td>{{ book.name }}</td>
                  <td>{{ book.price }}</td>
               </tr>
            {% endfor %}
         </tbody>
      </table>
      
   </body>
</html>

4、效果

5、知識點

CRUD操作:

  • db.session.add (模型物件) - 將記錄插入到對映表中
  • db.session.delete (模型物件) - 從表中刪除記錄
  • model.query.all()  - 從表中檢索所有記錄(對應於SELECT查詢)。

寫在最後

在寫這部分文章時候,總感覺它跟mybatis很像,比如可以將資料從資料庫對映到物件,支援建立資料庫表和定義資料模型,並提供了相應的介面及對應事務的操作,直白點說,不用手撕sql

但就效能來看的話,還是MyBatis好,畢竟是持久層框架,哈哈!