前置閱讀,關于
Flask-SQLAlchemy
支持哪些數據庫及基本配置,鏈接:Flask-SQLAlchemy_數據庫配置
摘要
本文以一段典型的 SQLAlchemy 代碼示例為引入,闡述以下核心概念:
- 模型類(Model Class) ? 數據庫表(Database Table)
- 類屬性(db.Column) ? 表字段(Table Columns)
- 外鍵(ForeignKey) ? 關系映射(relationship)
通過集中解釋屬性定義、關系概念與示例,幫助讀者快速掌握 SQLAlchemy 在 Flask 應用中的基本用法。
1. 代碼示例
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime# 初始化 Flask 應用
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' # 使用 SQLite 數據庫
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 初始化 SQLAlchemy
db = SQLAlchemy(app)# 用戶模型(映射 user 表)
class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(50), unique=True, nullable=False)password_hash = db.Column(db.String(255), nullable=False)posts = db.relationship('Post', backref='author', lazy='select')# 內容模型(映射 post 表)
class Post(db.Model):id = db.Column(db.Integer, primary_key=True)content = db.Column(db.Text, nullable=False)create_time = db.Column(db.DateTime, default=datetime.utcnow)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)# 創建所有模型對應的數據庫表
with app.app_context():db.create_all()
2. 核心概念
2.1 模型類(Model Class) ? 數據庫表(Database Table)
- 每個繼承自
db.Model
的類都對應一張數據庫表,默認表名為類名小寫(如User
類對應user
表)。 - 在執行
db.create_all()
時,SQLAlchemy 會檢查數據庫中是否存在對應的表:若表不存在則根據模型定義創建新表;若表已存在,則不會對其進行修改或刪除,從而保證不會重復創建或覆蓋已有數據。
2.2 類屬性(db.Column) ? 表字段(Table Columns)
在 SQLAlchemy 中,通過 db.Column()
在模型類中定義字段,其調用簽名為:
db.Column(type_, *args, **kwargs)
-
type_
:字段的數據類型,如db.Integer
、db.String(長度)
、db.Text
、db.DateTime
等。 -
*args
:可選位置參數,如db.ForeignKey('表名.字段名')
。 -
**kwargs
:關鍵字參數控制字段約束與行為,包括:primary_key=True
:主鍵。unique=True
:唯一約束。nullable=False
:非空約束。default=...
:Python 層面的默認值。server_default=text('...')
:數據庫層面的默認值(需導入from sqlalchemy import text
)。index=True
:創建索引。autoincrement=True
:整型主鍵自動遞增。comment='...'
:列注釋。doc='...'
:ORM 文檔字符串。
2.3 外鍵(ForeignKey) ? 關系映射(relationship)
2.3.1 外鍵(ForeignKey)
- 外鍵 是關系型數據庫中用于維護表間引用完整性的約束機制,本質是一張表(子表)中的列,其值必須匹配另一張表(父表)中某列(通常是主鍵)的有效值。
- 需要通過
db.Column
中傳入db.ForeignKey('目標表.目標列')
來定義,對應數據庫表中的一列。
示例
# Post 模型中的外鍵字段,定義為類屬性,映射到數據庫表的 user_id 列
user_id = db.Column(db.Integer,db.ForeignKey('user.id'), # 在 Column 中聲明外鍵nullable=False
)
2.3.2 關系映射(relationship)
- 關系映射 用于在模型之間建立對象關聯:它不在數據庫中創建新列,而是為模型添加屬性,方便在 ORM 中通過屬性訪問相關對象。
relationship('TargetModel', backref='reverse_attr', lazy=...)
,即可實現雙向導航:
- 目標模型名 (
'TargetModel'
):指定關聯的模型類名稱(字符串形式)。 backref
參數:在目標模型中創建反向屬性reverse_attr
,可以自動關聯到唯一外鍵。lazy
參數:控制加載策略,如select
(默認,訪問時發起查詢)、joined
(關聯加載)、subquery
等。
示例:一對多關系
class User(db.Model):# ... 字段定義 ...posts = db.relationship('Post', # 目標模型類名backref='author', # 在 Post 中創建 author 屬性lazy='select' # 默認延遲加載)class Post(db.Model):# ... 字段定義 ...user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
posts
屬性(“一”方)user.posts
返回一個列表,包含該用戶所有的Post
對象。
author
屬性(“多”方)post.author
直接返回對應的User
對象。