Flask數據庫操作:SQLAlchemy ORM基礎教程

爲什麼需要ORM?

在Web開發中,數據庫操作是核心環節之一。直接寫SQL語句雖然靈活,但對於複雜項目來說,維護成本高、代碼可讀性差。而ORM(對象關係映射)可以將數據庫表與Python對象對應起來,讓我們用面向對象的方式操作數據庫,無需關心底層SQL細節。

SQLAlchemy是Python中最流行的ORM庫之一,Flask通過Flask-SQLAlchemy擴展簡化了與SQLAlchemy的集成。本文將帶你從0開始,掌握Flask+SQLAlchemy的基礎數據庫操作。

環境準備與安裝

首先確保安裝了必要的庫:

pip install flask flask-sqlalchemy
  • flask:Web框架基礎
  • flask-sqlalchemy:Flask與SQLAlchemy的集成擴展

初始化Flask應用與SQLAlchemy

創建一個app.py文件,開始配置應用和數據庫:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 初始化Flask應用
app = Flask(__name__)

# 配置數據庫(以SQLite爲例,無需額外安裝,文件存儲在本地)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'  # 數據庫文件路徑
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 關閉修改跟蹤,節省資源

# 初始化SQLAlchemy實例
db = SQLAlchemy(app)

定義數據庫模型(Model)

ORM的核心是模型類,類名對應數據庫表名,類屬性對應表字段。以下是一個簡單的User模型示例:

class User(db.Model):
    # 定義表字段:
    id = db.Column(db.Integer, primary_key=True)  # 主鍵,自增
    username = db.Column(db.String(80), unique=True, nullable=False)  # 用戶名,唯一且非空
    email = db.Column(db.String(120), unique=True, nullable=False)  # 郵箱,唯一且非空
    age = db.Column(db.Integer)  # 年齡,可選

    # 可選:定義對象的字符串表示形式(方便調試)
    def __repr__(self):
        return f'<User {self.username}>'
  • db.Column():定義字段,參數包括數據類型(如IntegerString)、約束(unique/nullable)等
  • primary_key=True:設爲主鍵,自動遞增
  • db.Model:所有模型類需繼承此基類

創建數據庫表

定義好模型後,需要創建實際的數據庫表。在Python交互環境或應用入口處執行:

# 在Flask shell中操作(推薦)
# 1. 打開終端,進入項目目錄
# 2. 執行 `flask shell` 進入Python交互環境
# 3. 導入db和模型
from app import db, User

# 創建所有表
db.create_all()  # 執行後,mydatabase.db文件會生成,包含User表
  • 執行db.create_all()會自動根據模型類創建表,無需手動寫CREATE TABLE語句

基本CRUD操作(創建、讀取、更新、刪除)

數據庫操作圍繞會話(session) 進行,db.session用於管理事務(提交/回滾)。

1. 創建(Create)數據
# 創建新用戶
new_user = User(
    username="Alice",
    email="alice@example.com",
    age=25
)

# 添加到會話
db.session.add(new_user)

# 提交事務(保存到數據庫)
db.session.commit()
  • 注意:必須先addcommit,否則數據不會寫入數據庫
2. 讀取(Read)數據
# 查詢所有用戶
all_users = User.query.all()  # 返回User對象列表
for user in all_users:
    print(user.username, user.email)

# 按條件查詢(如查詢用戶名等於Alice的用戶)
user = User.query.filter_by(username="Alice").first()  # 返回第一個匹配的對象
print(user.email)  # 輸出:alice@example.com

# 按主鍵查詢
user = User.query.get(1)  # id=1的用戶(假設Alice是第一個用戶)
print(user.age)  # 輸出:25
  • filter_by():按字段值篩選(username="Alice"
  • first():返回第一個結果;all():返回所有結果
  • get():按主鍵快速查詢(性能更高)
3. 更新(Update)數據
# 查詢用戶
user = User.query.get(1)
if user:
    user.age = 26  # 修改年齡
    db.session.commit()  # 提交修改
  • 修改對象屬性後,需commit才能保存到數據庫
4. 刪除(Delete)數據
# 查詢用戶
user = User.query.get(1)
if user:
    db.session.delete(user)  # 從會話中刪除對象
    db.session.commit()  # 提交事務,表中數據被刪除

完整示例:Flask應用中的數據庫操作

將上述步驟整合爲一個簡單的Flask應用(app.py):

from flask import Flask, render_template_string
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

# 定義模型
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

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

# 創建表(應用啓動時執行)
with app.app_context():
    db.create_all()

# 路由示例:顯示所有用戶
@app.route('/')
def index():
    users = User.query.all()
    return render_template_string('''
        <h1>用戶列表</h1>
        <ul>
            {% for user in users %}
                <li>{{ user.username }}: {{ user.email }}</li>
            {% endfor %}
        </ul>
    ''', users=users)

# 路由示例:添加新用戶(可通過POST請求測試)
@app.route('/add')
def add_user():
    new_user = User(username="Bob", email="bob@example.com")
    db.session.add(new_user)
    db.session.commit()
    return "用戶添加成功!"

if __name__ == '__main__':
    app.run(debug=True)

總結

通過SQLAlchemy ORM,我們可以用Python對象直接操作數據庫,大幅簡化CRUD代碼。核心步驟:
1. 初始化db對象,配置數據庫
2. 定義模型類,映射表結構
3. 執行db.create_all()創建表
4. 通過db.session進行增刪改查操作

初學者可從SQLite開始練習,熟悉後可嘗試MySQL/PostgreSQL(只需修改SQLALCHEMY_DATABASE_URI)。更多高級特性(如關係模型、關聯查詢)可後續探索~

小夜