深入理解 Flask ORM:用 SQLAlchemy 優雅操作數據庫
一、前言:什么是 ORM?為什么要用它?
傳統數據庫操作要寫 SQL,比如:
SELECT * FROM users WHERE id = 1;
而使用 ORM 后,你可以這樣寫:
user = User.query.get(1)
ORM 的優勢:
- 可讀性強:更符合 Python 編程風格
- 更安全:自動防止 SQL 注入
- 更易維護:模型即數據結構,不需要手寫 SQL
- 便于遷移和擴展:跨數據庫兼容性強
二、Flask 中使用 SQLAlchemy 的 ORM
首先你需要安裝擴展:
pip install flask flask_sqlalchemy
三、快速入門:定義模型
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
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}>"
初始化數據庫:
python
>>> from app import db
>>> db.create_all()
四、字段類型詳解(Column Types)
類型 | 含義 |
---|---|
Integer | 整數 |
String(length) | 字符串 |
Text | 長文本 |
Boolean | 布爾值 |
Date / DateTime | 日期/日期時間 |
Float / Numeric | 浮點 / 精確小數 |
你還可以傳入參數控制字段約束:
nullable=False # 非空
unique=True # 唯一約束
default='value' # 默認值
五、常見 ORM 查詢操作(CRUD)
1. 增(Create)
user = User(username='alice', email='alice@example.com')
db.session.add(user)
db.session.commit()
2. 查(Read)
# 查詢所有用戶
User.query.all()# 查詢第一個
User.query.first()# 條件查詢
User.query.filter_by(username='alice').first()# 主鍵查詢
User.query.get(1)
3. 改(Update)
user = User.query.get(1)
user.email = 'new@example.com'
db.session.commit()
4. 刪(Delete)
db.session.delete(user)
db.session.commit()
六、模型之間的關系建模(重點)
1. 一對多關系(User -> Post)
class Post(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100))content = db.Column(db.Text)user_id = db.Column(db.Integer, db.ForeignKey('user.id'))user = db.relationship('User', backref='posts')
使用方式:
user = User.query.first()
for post in user.posts:print(post.title)
2. 多對多關系
association = db.Table('association',db.Column('user_id', db.Integer, db.ForeignKey('user.id')),db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)class Tag(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(30))users = db.relationship('User', secondary=association, backref='tags')
七、模型中的方法與屬性
你可以在模型中添加自定義方法:
class User(db.Model):...def is_email_valid(self):return '@' in self.email
八、數據庫遷移:保持模型與數據庫結構一致
使用 Flask-Migrate 可以自動生成遷移腳本。
pip install flask-migrate
在 app.py 中初始化:
from flask_migrate import Migratemigrate = Migrate(app, db)
命令行使用:
flask db init
flask db migrate -m "Initial"
flask db upgrade
九、項目結構建議(大中型項目)
推薦將模型拆分至 models/
文件夾中,并使用工廠函數初始化 Flask 應用。
結構如下:
project/
├── app/
│ ├── __init__.py ← 創建 Flask 實例
│ ├── models/
│ │ ├── __init__.py
│ │ ├── user.py
│ │ └── post.py
十、最佳實踐總結
- 使用 Flask-SQLAlchemy 管理模型與數據庫
- 用
db.relationship()
管理表之間的聯系 - 用 Flask-Migrate 管理數據庫結構變更
- 模型即數據結構,推薦優先設計模型
- 注意避免循環引用(尤其在關系定義中)
十一、結語與擴展學習方向
通過本篇內容,你應該已經掌握:
- ORM 基礎與模型定義
- 常用字段與關系建模
- 數據庫查詢與事務操作
- 使用 Flask-Migrate 實現數據庫遷移