Python Flask - 使用 Flask SQLAlchemy 建立資料庫

前言

flask提供flask sqlalchemy套件讓開發人員可以更容易操控資料庫各項指令,除了支持MySQL等資料庫以外,可以直接使用SQLite,讓開發人員快速上手(is me 👋🏼),使用flask sqlalchemy時仍有一部分需要特別注意的小問題🤦🏻,我們也使用flask內建的flask shell驗證我們的資料庫

安裝與使用flask-sqlachemy

  1. 安裝flask-sqlachemy

    1
    pip install flask-sqlalchemy
  2. 引入flask-bootstrap並實體化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # app.py
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy

    app = Flask(__name__)

    # 設定資料庫儲存位置 "sqlite:///" + "位置"
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.sqlite'
    # .
    # ├── app.py
    # └── instance
    # └── database.sqlite

    # e.g. /tmp/database.sqlite
    # app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/database.sqlite'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 減少使用額外記憶體
    db = SQLAlchemy(app)

    class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    # 設定id為primary key
    username = db.Column(db.String(20), unique=True, nullable=False)
    # 設定username為string type, 長度最多20, unique: 不可重複, nullable: 不可空值
    password = db.Column(db.String(20), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
    return f'<User {self.username}>'

    ⚠️ 使用flask-sqlalchemy前必須要先設定app.config[‘SQLALCHEMY_DATABASE_URI’], 否則會報錯誤訊息:
    RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.

  3. 使用flask shell存取db(database), User(table)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    flask shell # 開啟 flask shell

    from app import db, User # 引入db(database)及User(table)
    db.create_all() # 建立db

    User.query.all() # [], 因此時無資料

    u1 = User(username="mu", password="pwd", email="mu@gmail.com") # 新增User

    u1 # <User mu>
    u1.username # 'mu'
    u1.password # 'pwd'
    u1.email # 'mu@gmail.com'

    db.session.add(u1) # 新增u1至db
    db.session.commit() # 儲存至db

    User.query.all() # [<User mu>]
    User.query.filter_by(username='mu').first() # <User mu>, 條件查詢

    ⚠️ 新增資料前必須先執行db.create_all()建立資料庫,否則無法新增資料
    ⚠️ 必須執行db.session.commit()才會將資料儲存至資料庫內

結論

  • 使用sqlalchemy必須先設定資料庫路徑❗️
  • 建立一個table(User)
  • 使用flask shell進行測試
  • 新增資料庫資料前,需建立資料庫❗️
  • 資料最後必須執行儲存指令才會存至資料庫❗️
  • sqlalchemy可條件篩選資料