db 對象(Flask-SQLAlchemy 實例)是數據庫操作的核心入口,通過它可以完成 CRUD(增刪改查)、事務管理、表結構操作等所有數據庫相關任務。以下是具體使用方法和示例:
一、核心操作對象
db 對象的核心功能通過以下子對象 / 方法實現:
db.Model:所有數據模型的基類(用於定義表結構)。db.session:數據庫會話(用於執行增刪改查、提交事務)。db.Column:定義表字段(如id、username)。db.create_all()/db.drop_all():創建 / 刪除所有表(基於模型定義)。
二、基本數據庫操作(CRUD)
假設已定義 User 模型(繼承 db.Model):
python
運行
# app/models/user.py
from app import db
class User(db.Model):
__tablename__ = "users"
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)
1. 新增數據(Create)
通過 db.session.add() 添加記錄,db.session.commit() 提交事務:
python
運行
from app import db
from app.models.user import User
# 創建新用户對象
new_user = User(
username="test_user",
email="test@example.com"
)
# 步驟1:添加到會話(暫存內存,未寫入數據庫)
db.session.add(new_user)
# 步驟2:提交事務(寫入數據庫,此時才會生成id)
db.session.commit()
print(f"新增用户ID:{new_user.id}") # 提交後可獲取自增ID
2. 查詢數據(Read)
通過模型類的 query 方法(繼承自 db.Model)執行查詢:
python
運行
# 1. 查詢所有記錄
all_users = User.query.all() # 返回列表,包含所有User對象
for user in all_users:
print(user.username, user.email)
# 2. 按條件查詢(單條記錄)
user = User.query.filter_by(username="test_user").first() # 返回第一個匹配對象
if user:
print(f"找到用户:{user.username}")
# 3. 按主鍵查詢(常用)
user = User.query.get(1) # 查詢id=1的用户,不存在返回None
# 4. 複雜條件查詢(使用filter而非filter_by)
from sqlalchemy import or_
users = User.query.filter(
or_(User.username == "test_user", User.email.endswith("@example.com"))
).all() # 或條件:用户名是test_user 或 郵箱以@example.com結尾
3. 更新數據(Update)
先查詢到對象,修改屬性後提交事務:
python
運行
# 步驟1:查詢要更新的對象
user = User.query.get(1)
if not user:
print("用户不存在")
# 步驟2:修改屬性
user.email = "new_email@example.com"
# 步驟3:提交事務(自動更新數據庫)
db.session.commit()
print(f"更新後郵箱:{user.email}")
4. 刪除數據(Delete)
通過 db.session.delete() 移除記錄,再提交事務:
python
運行
# 步驟1:查詢要刪除的對象
user = User.query.get(1)
if not user:
print("用户不存在")
# 步驟2:從會話中刪除
db.session.delete(user)
# 步驟3:提交事務(數據庫中刪除記錄)
db.session.commit()
print("用户已刪除")
三、事務管理
db.session 內置事務支持,確保一組操作的原子性(要麼全成功,要麼全失敗):
python
運行
try:
# 操作1:新增用户A
user_a = User(username="a", email="a@test.com")
db.session.add(user_a)
# 操作2:新增用户B(假設郵箱重複,會觸發唯一約束錯誤)
user_b = User(username="b", email="a@test.com") # 郵箱與user_a衝突
db.session.add(user_b)
# 提交事務:若任何一步失敗,自動回滾
db.session.commit()
print("所有操作成功")
except Exception as e:
# 發生錯誤時回滾(撤銷所有未提交的操作)
db.session.rollback()
print(f"操作失敗,已回滾:{str(e)}")
四、表結構操作
1. 創建所有表
基於模型類自動生成數據庫表(首次運行時使用):
python
運行
# 需在Flask應用上下文中執行(如create_app函數中)
with app.app_context():
db.create_all() # 檢查並創建所有未存在的表
print("表創建成功")
2. 刪除所有表(謹慎使用!)
刪除所有模型對應的表(數據會丟失):
python
運行
with app.app_context():
db.drop_all() # 刪除所有表
print("表已刪除")
五、高級操作
1. 分頁查詢
處理大量數據時使用分頁:
python
運行
page = 1 # 第1頁
per_page = 10 # 每頁10條
pagination = User.query.paginate(page=page, per_page=per_page)
# 獲取當前頁數據
users = pagination.items # 列表:當前頁的User對象
# 分頁信息
print(f"總頁數:{pagination.pages}")
print(f"總記錄數:{pagination.total}")
print(f"是否有下一頁:{pagination.has_next}")
2. 排序查詢
按字段排序(升序 / 降序):
python
運行
from sqlalchemy import desc
# 按username升序(默認)
users_asc = User.query.order_by(User.username).all()
# 按id降序(最新的在前)
users_desc = User.query.order_by(desc(User.id)).all()
六、注意事項
- 必須在應用上下文中操作所有數據庫操作(查詢、提交等)必須在 Flask 應用上下文(
app.app_context())中執行,否則會報錯。例如在腳本中:
python
運行
from app import create_app, db
app = create_app()
with app.app_context(): # 激活上下文
# 在這裏執行數據庫操作(如查詢、新增)
users = User.query.all()
- 避免長時間未提交的會話
db.session會保持數據庫連接,長時間不提交(commit)或回滾(rollback)可能導致連接泄露,建議及時處理事務。 - 查詢性能複雜查詢建議使用
db.session.execute()直接執行 SQL 語句,例如:
python
運行
result = db.session.execute("SELECT username FROM users WHERE id > :id", {"id": 5})
for row in result:
print(row.username)
總結
db 對象的使用遵循 “模型定義 → 會話操作 → 事務提交” 的流程:
- 通過
db.Model和db.Column定義表結構; - 通過
db.session執行增刪改查; - 通過
commit()/rollback()管理事務; - 通過
create_all()/drop_all()管理表結構。
掌握這些操作後,即可完成絕大多數數據庫交互需求。