1. 什麼是SQLAlchemy?¶
在使用Flask開發Web應用時,我們經常需要與數據庫交互(如存儲用戶信息、商品數據等)。直接寫SQL語句雖然可行,但對初學者不夠友好,且不同數據庫(如MySQL、PostgreSQL)的語法差異大。SQLAlchemy是Python中最流行的ORM(對象關係映射)工具,它允許我們用Python類和對象操作數據庫,無需編寫原始SQL,同時支持多種數據庫(SQLite、MySQL、PostgreSQL等)。
2. 安裝依賴¶
要在Flask中使用SQLAlchemy,需先安裝兩個庫:
- Flask:Flask框架核心
- Flask-SQLAlchemy:Flask的SQLAlchemy擴展
在終端執行:
pip install flask flask-sqlalchemy
如果使用SQLite(無需額外安裝驅動,適合測試),直接安裝上述依賴即可。若使用MySQL或PostgreSQL,需額外安裝對應驅動(如pymysql或psycopg2-binary)。
3. 初始化Flask與SQLAlchemy¶
首先創建一個Flask應用,並配置SQLAlchemy連接數據庫。
示例代碼:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 1. 創建Flask應用
app = Flask(__name__)
# 2. 配置數據庫連接(SQLite爲例,路徑爲相對路徑,會自動創建test.db文件)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
# 關閉SQLAlchemy的修改跟蹤功能(可選,減少性能開銷)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 3. 初始化SQLAlchemy,傳入Flask應用
db = SQLAlchemy(app)
4. 定義數據模型¶
SQLAlchemy通過類定義數據庫表,每個類對應一張表,類屬性對應表字段。
示例:定義User表
class User(db.Model):
# 表名默認爲類名小寫,可自定義:__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=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}>'
字段類型與約束:
- db.Integer:整數(如主鍵ID)
- db.String(length):字符串(需指定長度,如String(80))
- primary_key=True:設爲主鍵(唯一標識每條記錄)
- unique=True:字段值唯一(如用戶名、郵箱)
- nullable=False:字段不可爲空
- autoincrement=True:主鍵自增(整數類型常用)
5. 創建數據庫表¶
定義好模型後,需將模型轉換爲數據庫表。通過db.create_all()實現,需在應用上下文中執行。
代碼示例:
# 確保在正確的Python環境中執行(若在單獨腳本中,需導入app和db)
from app import app, db # 假設上述代碼在app.py中
with app.app_context(): # 進入應用上下文(Flask 2.0+ 必須)
db.create_all() # 根據模型創建數據庫表
執行後,項目根目錄會生成test.db文件(SQLite),表結構與User類對應。
6. 基本操作(CRUD)¶
CRUD即增(Create)、刪(Delete)、改(Update)、查(Read),是數據庫操作的核心。
6.1 新增數據(Create)¶
通過創建模型實例,添加到會話(session)並提交。
示例:
from app import app, db, User # 導入模型
with app.app_context():
# 創建用戶實例
user = User(username='Alice', email='alice@example.com')
# 添加到會話
db.session.add(user)
# 提交會話(執行SQL插入)
db.session.commit()
6.2 查詢數據(Read)¶
通過query對象查詢數據,支持多種條件。
示例:
with app.app_context():
# 1. 查詢所有用戶
all_users = User.query.all() # 返回列表
print(all_users) # 輸出:[<User Alice>, ...]
# 2. 按條件查詢(如查用戶名=Alice的用戶)
alice = User.query.filter_by(username='Alice').first() # 返回單個對象
print(alice.email) # 輸出:alice@example.com
# 3. 按ID查詢(主鍵查詢)
user_by_id = User.query.get(1) # 假設ID=1是Alice
print(user_by_id.username) # 輸出:Alice
6.3 修改數據(Update)¶
先查詢到目標對象,修改屬性後提交。
示例:
with app.app_context():
# 查詢用戶
alice = User.query.filter_by(username='Alice').first()
# 修改郵箱
alice.email = 'alice_new@example.com'
# 提交修改
db.session.commit()
6.4 刪除數據(Delete)¶
查詢到目標對象,刪除後提交。
示例:
with app.app_context():
# 查詢用戶
alice = User.query.filter_by(username='Alice').first()
# 刪除對象
db.session.delete(alice)
# 提交刪除
db.session.commit()
7. 總結¶
通過SQLAlchemy操作數據庫的核心流程:
1. 配置Flask與SQLAlchemy連接;
2. 定義數據模型(對應數據庫表);
3. 用db.create_all()創建表;
4. 通過db.session執行CRUD操作。
SQLAlchemy的優勢是無需寫SQL,用Python對象直接操作,適合快速開發和維護。初學者可先掌握單表的基礎操作,後續再學習多表關聯(如外鍵、關係字段)。