Flask-SQLAlchemy核心概念:模型類與數據庫表、類屬性與表字段、外鍵與關系映射

前置閱讀,關于Flask-SQLAlchemy支持哪些數據庫及基本配置,鏈接:Flask-SQLAlchemy_數據庫配置

摘要

本文以一段典型的 SQLAlchemy 代碼示例為引入,闡述以下核心概念:

  1. 模型類(Model Class) ? 數據庫表(Database Table)
  2. 類屬性(db.Column) ? 表字段(Table Columns)
  3. 外鍵(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.Integerdb.String(長度)db.Textdb.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 對象。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84059.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84059.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84059.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

野火魯班貓(arrch64架構debian)從零實現用MobileFaceNet算法進行實時人臉識別(四)安裝RKNN Toolkit2

RKNN Toolkit2是用來將onnx模型轉成rknn專用模型,并可通過RKNN Toolkit Lite2或者RKNPU調用NPU進行加速計算的工具。 一開始我安裝很多次都無法成功安裝。后來跟售后技術對接,必須是PC平臺的Linux環境才可以。我的電腦是windows,所以我需要用…

基于深度學習的工件檢測系統設計與實現

在工業自動化領域,工件檢測一直是提高生產效率和產品質量的關鍵環節。傳統的人工檢測方法不僅效率低下,而且容易受到主觀因素的影響,導致誤判率較高。隨著深度學習技術的飛速發展,基于圖像識別的自動檢測系統逐漸成為研究熱點。今…

CyberSecAsia專訪CertiK首席安全官:區塊鏈行業亟需“安全優先”開發范式

近日,權威網絡安全媒體CyberSecAsia發布了對CertiK首席安全官Wang Tielei博士的專訪,雙方圍繞企業在進軍區塊鏈領域時所面臨的關鍵安全風險與防御策略展開深入探討。 Wang博士在采訪中指出,跨鏈橋攻擊、智能合約漏洞以及私鑰管理不當&#x…

Google C++ Style Guide 谷歌 C++編碼風格指南,深入理解華為與谷歌的編程規范——C和C++實踐指南

Google C 編程風格指南 Release Apr 07, 2017 0. ?享 ?? 4.45 ??? Benjy Weinberger, Craig Silverstein, Gregory Eitzmann, Mark Mentovai, Tashana Landray ?? YuleFox, Yang.Y, acgtyrant, lilinsanity 亯??享 ? Google Style Guide ? Google 開源…

當科技邂逅浪漫:在Codigger的世界里,遇見“愛”

520,一個充滿愛意的日子,人們用各種方式表達對彼此的深情。而在科技的世界里,我們也正經歷著一場特別的邂逅——Codigger,一個分布式操作系統的誕生,正在以它獨特的方式,重新定義我們與技術的關系。 Codigg…

嵌入式學習筆記 - Void類型的指針

void指針的基本概念和特性 void指針是一種特殊的指針類型,稱為“無類型指針”或“通用指針”。它的主要特點是: ?通用性?:void指針可以指向任何類型的數據,這使得它在處理不確定數據類型時非常有用。 ?靈活性?:由…

【綜述】視頻目標分割VOS

相關連接 更新中....... 1、Associating Objects with Transformers for Video Object Segmentation:論文詳解、AOT源碼解析 2、Rethinking Space-Time Networks with Improved Memory Coverage for Efficient Video Object Segmentation 3、Recurrent Dynamic Embe…

001 嵌入式軟件開發工程師實習篇面試——首戰總結

2025年5月17日人生中第一次面試 緊張是藏不住的。但是不應該的。 目錄 0.準備一份合適的自我介紹 1.結構體內存對齊問題 2.變量在內存中的存儲模式 3.嵌入式中程序框架有哪些 4.程序代碼設計要遵循什原則 5.版本號書寫 6.單片機最小系統板有哪些組成 必須: 非必須:…

SIL2/PLd 認證 Inxpect毫米波安全雷達:3D 掃描 + 微小運動檢測守護工業安全

Inxpect 成立于意大利,專注工業安全技術。自成立起,便致力于借助先進雷達技術提升工業自動化安全標準,解決傳統安全設備在復雜環境中的局限,推出獲 SIL2/PLd 和 UL 認證的安全雷達產品。 Inxpect 的雷達傳感器技術優勢明顯。相較于…

Python數據可視化再探——Matplotlib模塊 之一

目錄 第一章 Matplotlib 模塊教學內容?——基礎圖形繪制 一、Pyplot 子庫介紹? 1. 功能概述? 2. 常用函數? 二、繪制基本圖形? 1. 柱狀圖? 2. 條形圖? 3. 折線圖? 4. 散點圖? 5. 面積圖? 6. 餅狀圖? 7. 圓環圖? ?編輯 三、繪圖知識點詳解? 1. 繪圖…

智慧在線判題OJ系統項目總體,包含功能開發思路,內部中間件,已經部分知識點

目錄 回顧一下xml文件怎么寫 哪個地方使用了哪個技術 MyBatis-Plus-oj的表結構設計, 管理員登錄功能 Swagger Apifox?編輯 BCrypt 日志框架引入(slf4jlogback) nacos Swagger無法被所有微服務獲取到修改的原因 身份認證三種方式: JWT(Json Web Json,一…

使用Spring Boot和Spring Security構建安全的RESTful API

使用Spring Boot和Spring Security構建安全的RESTful API 引言 在現代Web應用開發中,安全性是至關重要的。Spring Boot和Spring Security是Java生態中廣泛使用的框架,它們提供了強大的工具來保護RESTful API。本文將介紹如何結合Spring Boot和Spring S…

虛幻引擎5-Unreal Engine筆記之`GameMode`、`關卡(Level)` 和 `關卡藍圖(Level Blueprint)`的關系

虛幻引擎5-Unreal Engine筆記之GameMode、關卡(Level) 和 關卡藍圖(Level Blueprint)的關系 code review! 參考筆記: 1.虛幻引擎5-Unreal Engine筆記之GameMode、關卡(Level) 和 關卡藍圖&…

Java+Selenium+快代理實現高效爬蟲

目錄 一、前言二、Selenium簡介三、環境準備四、代碼實現4.1 創建WebDriver工廠類4.2 創建爬蟲主類4.3 配置代理的注意事項 六、總結與展望 一、前言 在Web爬蟲技術中,Selenium作為一款強大的瀏覽器自動化工具,能夠模擬真實用戶操作,有效應對…

SpringBoot配置文件的合并

需求:想分類將mysql數據庫的配置放在一個文件,redis的配置放在另外一個文件 就不去引入mysql和redis了,看能否得到值就行了 測試結果 model的包放錯了 應該移動到demo里 能否用yml或者yaml呢 這里注意yml的寫法 測試結果也是可以的 注意如果主配置文件是yml或者yaml的話

深入理解 BFC:網頁布局的關鍵機制

在前端開發的世界里,網頁布局是一項至關重要的任務。而在眾多布局相關的概念中,BFC(Block Formatting Context,塊級格式化上下文)扮演著極為關鍵的角色。今天,就讓我們深入剖析 BFC 的方方面面。 一、BFC …

04-Web后端基礎(基礎知識)

而像HTML、CSS、JS 以及圖片、音頻、視頻等這些資源,我們都稱為靜態資源。 所謂靜態資源,就是指在服務器上存儲的不會改變的數據,通常不會根據用戶的請求而變化。 那與靜態資源對應的還有一類資源,就是動態資源。那所謂動態資源&…

Vue3 Element Plus el-table-column Sortable 排序失效

問題描述&#xff1a; vue3中 element plus 中 el-table 的 el-table-column使用了插槽后&#xff0c;為什么sortable不起效果&#xff0c;不能點擊排序 <el-table-columnlabel"記賬日期"width"110"fixed"left"header-align"left"…

Unity中SRP Batcher使用整理

SRP Batcher 是一種繪制調用優化,可顯著提高使用 SRP 的應用程序的性能,SRP Batcher 減少了Unity為使用相同著色器變體的材質準備和調度繪制調用所需的CPU 時間。 工作原理: 傳統優化方法通過減少繪制調用次數提升性能,而SRP Batcher的核心理念在于降低繪制調用間的渲染狀…

服務器的基礎知識

什么是服務器 配置牛、運行穩、價格感人的高級計算機&#xff0c;家用電腦不能比擬的。 服務器的組成&#xff1a;電源、raid卡、網卡、內存、cpu、主板、風扇、硬盤。 服務器的分類 按計算能力分類 超級計算機 小型機AIX x86服務器&#xff08;服務器cpu架構&#xff09; …