【Flask】ORM模型以及數據庫遷移的兩種方法(flask-migrate、Alembic)

ORM模型

在Flask中,ORM(Object-Relational Mapping,對象關系映射)模型是指使用面向對象的方式來操作數據庫的編程技術。它允許開發者使用Python類和對象來操作數據庫,而不需要直接編寫SQL語句。

核心概念

1. ORM模型定義

在Flask中,ORM模型通常是通過SQLAlchemy(最流行的Python ORM工具)或類似的庫來定義的。一個ORM模型對應數據庫中的一個表。

from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()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}>'

2. 主要特點

  • 表映射為類:每個數據庫表對應一個Python類

  • 列映射為屬性:表中的列對應類的屬性

  • 行映射為對象:表中的每一行數據對應類的一個實例

常用字段類型

ORM類型Python類型數據庫類型
db.IntegerintINTEGER
db.String(size)strVARCHAR(size)
db.TextstrTEXT
db.FloatfloatFLOAT
db.BooleanboolBOOLEAN
db.DateTimedatetime.datetimeDATETIME
db.Datedatetime.dateDATE
db.Timedatetime.timeTIME
db.LargeBinarybytesBLOB

模型關系

1. 一對多關系

class User(db.Model):id = db.Column(db.Integer, primary_key=True)posts = db.relationship('Post', backref='author', lazy=True)class Post(db.Model):id = db.Column(db.Integer, primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

2. 多對多關系

tags = db.Table('tags',db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),db.Column('post_id', db.Integer, db.ForeignKey('post.id'), primary_key=True)
)class Post(db.Model):id = db.Column(db.Integer, primary_key=True)tags = db.relationship('Tag', secondary=tags, lazy='subquery',backref=db.backref('posts', lazy=True))class Tag(db.Model):id = db.Column(db.Integer, primary_key=True)

基本CRUD操作

1. 創建(Create)

new_user = User(username='john', email='john@example.com')
db.session.add(new_user)
db.session.commit()

2. 讀取(Read)

# 獲取所有用戶
users = User.query.all()# 獲取單個用戶
user = User.query.get(1)# 條件查詢
user = User.query.filter_by(username='john').first()

3. 更新(Update)

user = User.query.get(1)
user.email = 'new@example.com'
db.session.commit()

4. 刪除(Delete)

user = User.query.get(1)
db.session.delete(user)
db.session.commit()

在Flask中使用ORM模型

  1. 首先需要配置數據庫URI:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
  1. 創建數據庫表:

with app.app_context():db.create_all()

優勢

  1. 提高開發效率:不用寫原生SQL語句

  2. 代碼更易維護:數據庫操作以面向對象方式進行

  3. 數據庫無關性:可以輕松切換不同類型的數據庫

  4. 安全性:自動處理SQL注入等安全問題

注意事項

  1. 記得在修改模型后執行數據庫遷移(如使用Alembic)

  2. 批量操作時注意性能(N+1查詢問題)

  3. 復雜的查詢可能還是需要直接使用SQL

Flask中的ORM模型大大簡化了數據庫操作,使得開發者可以更專注于業務邏輯的實現。

創建外鍵



查詢外鍵



?

Flask連接MySQL數據庫+ORM增刪改查

在Flask中,很少會使用pymysql直接寫原生SQL語句去操作數據庫,更多的是通過SQLAichemy提供的ORM技術,類似于操作普通Python對象一樣實現數據庫的增刪改查操作,而Flask-SQLAlchemy是需要單獨安裝的,因為Flask-SQLAlchemy依賴SQLAlchemy,所以只要安裝了Flask-SQLAlchemy,SQLAlchemy會自動安裝。

pip install flask-sqlalchemy
# 登錄數據庫
mysql -u root -p
# 創建數據庫(支持中文)
CREATE DATABASE database_learn DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import textapp=Flask(__name__)# 設置連接數據庫的信息
HOSTNAME='127.0.0.1'
PORT=3306
USERNAME='root'
PASSWORD='123456'
DATABASE='database_learn'# 設置連接數據庫的URL
app.config['SQLALCHEMY_DATABASE_URI']=f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4'# 在app.config中設置好連接數據庫的信息,然后使用SQLLichemy(app)創建一個db對象
# SQLAlchemy會自動讀取app.config中連接數據庫的信息db=SQLAlchemy(app)with app.app_context():with db.engine.connect() as conn:result=conn.execute(text("select 1"))print(result.fetchone())@app.route('/')
def hello_world():return 'Hello World!'if __name__ == '__main__':app.run(debug=True)


一個ORM模型與一個數據庫中的一張表對應


創建數據庫表


其實就是創建一個ORM模型,而且user表有屬性是username和password




添加用戶


查詢用戶



我刷新了兩次add頁面,所以有兩個添加張三

更新用戶



刪除

Flask-migrate使用方法指南

?# flask-migrate遷移ORM模型
在終端中

pip install flask-migrate
flask db init
flask db migrate
flask db upgrade


自動生成。第一次創建的時候需要Init,后面再更新的話只需要后兩條命令

這樣就不需要再重新創建表設計表,能夠直接更新表的屬性

Alembic 使用方法指南

Alembic 是一個輕量級的數據庫遷移工具,專門為 SQLAlchemy 設計。以下是 Alembic 的基本使用方法:

1. 安裝

pip install alembic

2. 初始化

在項目目錄中初始化 Alembic:

alembic init alembic

這會創建一個?alembic?目錄和?alembic.ini?配置文件。

3. 配置

編輯?alembic.ini?文件,設置數據庫連接:

sqlalchemy.url = driver://user:pass@localhost/dbname

或者在?alembic/env.py?中動態配置:

config.set_main_option('sqlalchemy.url', 'your-database-url')

?

4. 創建遷移腳本

自動生成遷移腳本(基于模型變更):

alembic revision --autogenerate -m "描述信息"

手動創建空遷移腳本:

alembic revision -m "描述信息"

5. 編輯遷移腳本

生成的遷移腳本位于?alembic/versions/?目錄下,包含?upgrade()?和?downgrade()?函數。

6. 執行遷移

升級到最新版本:

alembic upgrade head

升級到特定版本:

alembic upgrade <版本號>

降級到特定版本:

alembic downgrade <版本號>

7. 其他常用命令

  • 查看當前版本:

alembic current
  • 查看歷史記錄:

alembic history
  • 生成 SQL 而不執行(用于檢查):

alembic upgrade head --sql

8. 與 Flask 集成

如果使用 Flask-SQLAlchemy,可以在?env.py?中:

from myapp import db
target_metadata = db.metadata

9. 最佳實踐

  1. 每次模型變更后生成新的遷移腳本

  2. 為每個遷移編寫清晰的描述信息

  3. 在團隊中共享遷移腳本

  4. 在生產環境部署前測試遷移

注意事項

  • 確保模型與數據庫同步

  • 自動生成遷移后檢查生成的腳本是否正確

  • 對于復雜變更,可能需要手動編輯遷移腳本

希望這個指南能幫助你開始使用 Alembic 進行數據庫遷移管理!

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

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

相關文章

C/C++滑動窗口算法深度解析與實戰指南

C/C滑動窗口算法深度解析與實戰指南 引言 滑動窗口算法是解決數組/字符串連續子序列問題的利器&#xff0c;通過動態調整窗口邊界&#xff0c;將暴力解法的O(n)時間復雜度優化至O(n)。本文將系統講解滑動窗口的核心原理、C/C實現技巧及經典應用場景&#xff0c;助您掌握這一高…

Vuex使用指南:狀態管理

一、什么是狀態管理&#xff1f;為什么需要 Vuex&#xff1f; 1. 狀態管理的基本概念 在 Vue 應用中&#xff0c;狀態指的是應用中的數據。例如&#xff1a; 用戶登錄狀態購物車中的商品文章列表的分頁信息 狀態管理就是對這些數據的創建、讀取、更新和刪除進行有效管理。 …

【信息系統項目管理師-論文真題】2007下半年論文詳解(包括解題思路和寫作要點)

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 試題1:大型項目的計劃與監控1、寫作要點2、解題思路大型信息系統項目的組織制訂大型信息系統項目進度計劃的方法試題2:組織級項目管理的績效考核1、寫作要點2、解題思路在項目考核過程中會遇到哪些問題項目的…

項目管理學習-CSPM(1)

01引言 最近在學習CSPM的課程&#xff0c;有部分的內容自己還是受益匪淺的&#xff0c;建議有需要提升項目管理能力的同學可以以考促學的方式進行學習&#xff0c;下面整理了一部分內容和大家分享和學習。CSPM全稱 China Standards Project Management&#xff0c;中文名項目管…

介紹分治、動態規劃、回溯分別是什么?有什么聯系和區別?給出對象的場景和java代碼?

一、分治算法&#xff08;Divide and Conquer&#xff09; 概念&#xff1a; 分治算法是將一個復雜問題分成若干個子問題&#xff0c;每個子問題結構與原問題類似&#xff0c;然后遞歸地解決這些子問題&#xff0c;最后將子問題的結果合并得到原問題的解。 特點&#xff1a;…

解鎖DeepSeek模型微調:從小白到高手的進階之路

目錄 一、DeepSeek 模型初相識二、探秘微調原理2.1 遷移學習基礎2.2 微調的參數更新機制 三、數據準備3.1 數據收集3.2 數據標注3.3 數據預處理 四、模型選擇與加載4.1 選擇合適的預訓練模型4.2 加載模型 五、微調訓練實戰5.1 確定微調策略5.2 設置訓練參數5.3 訓練過程 六、模…

端到端觀測分析:從前端負載均衡到后端服務

前言 我們在做系統運維保障的時候&#xff0c;關注從前端負載均衡到后端服務的流量情況是很有必要的&#xff0c;可以了解每個后端服務實例接收的流量大小&#xff0c;這有助于確定資源分配是否合理&#xff0c;能夠幫助找出后端服務中的性能瓶頸。同時&#xff0c;當系統出現…

Ubuntu下OCC7.9+Qt5 快速搭建3D可視化框架

Ubuntu下OCC7.9+Qt5搭建簡易的項目框架 近兩年國產CAD替代如日中天,而幾何內核作為CAD軟件的核心組件之一,當前有且僅有唯一開源的幾何內核庫即OCCT;這里為各位自立于投入CAD開發或正在學習OCC庫的小伙伴們奉獻上一個快速搭建QT+OCC的項目框架; 本文介紹了Qt5+Occ 顯示幾何…

C++類與對象—下:夯實面向對象編程的階梯

9. 賦值運算符重載 9.1 運算符重載 在 C 里&#xff0c;運算符重載能夠讓自定義類型的對象像內置類型那樣使用運算符&#xff0c;這極大地提升了代碼的可讀性與可維護性。運算符重載本質上是一種特殊的函數&#xff0c;其函數名是 operator 加上要重載的運算符。 下面是運算…

【深度學習-Day 6】掌握 NumPy:ndarray 創建、索引、運算與性能優化指南

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

工程師 - 汽車分類

歐洲和中國按字母對汽車分類&#xff1a; **軸距**&#xff1a;簡單來說&#xff0c;就是前輪中心點到后輪中心點之間的距離&#xff0c;也就是前輪軸和后輪軸之間的長度。根據軸距的大小&#xff0c;國際上通常把轎車分為以下幾類&#xff08;德國大眾汽車習慣用A\B\C\D分類&a…

[低代碼 + AI] 明道云與 Dify 的三種融合實踐方式詳解

隨著低代碼平臺和大語言模型工具的不斷發展,將企業數據與智能交互能力融合,成為提高辦公效率與自動化水平的關鍵一步。明道云作為一款成熟的低代碼平臺,Dify 則是一個支持自定義工作流的開源 LLM 應用框架。兩者結合,可以實現靈活、高效的智能化業務處理。 本文將詳解明道…

鼠標懸浮特效:常見6種背景類懸浮特效

鼠標懸浮特效&#xff1a;常見6種背景類懸浮特效 前言背景閃現效果預覽代碼展示 元素陰影效果預覽代碼展示 元素懸浮陰影效果預覽代碼展示 元素上浮陰影效果預覽代碼展示 元素邊框陰影效果預覽代碼展示 元素卷角效果預覽代碼展示 結語 前言 在之前的文章中&#xff0c;我們介紹…

[人機交互]理解與概念化交互

零.本章重點&#xff08;理解和分析用戶問題&#xff09; – 解釋“問題空間”的概念和含義 – 解釋如何概念化交互 – 描述什么是概念模型 – 討論將界面隱喻作為概念模型的利弊 – 討論界面具體化和抽象化各自的優缺點 – 概述概念設計和實際設計的關系 一.理解問題空間 簡單…

9.城市基礎設施更新工程

9.1 道路改造施工 9.1.1 道路改造施工內容 瀝青、水泥混凝土、砌塊路面、人行步道、綠化照明、附屬設施、交通標志、瀝青路面材料的再生利用 9.1.2 道路改造施工技術 1.瀝青路面病害及微表處理 1.病害處理 裂縫處理 10mm以內專業灌縫材料或熱瀝青灌縫、潮濕時乳化瀝青灌封…

Milvus(11):動態字段、可歸零和默認值

1 動態字段 Collections 的 Schema 中定義的所有字段都必須包含在要插入的實體中。如果希望某些字段是可選的&#xff0c;可以考慮啟用動態字段。 1.1 概述 在 Milvus 中&#xff0c;可以通過設置 Collections 中每個字段的名稱和數據類型來創建 Collections Schema。向 Schem…

LeetCode41?缺失的第一個正數

關聯LeetCode題號41 本題特點 數組&#xff0c;哈希表 本題思路 找缺失的最小正數&#xff0c;看舉例說明缺失的正數&#xff0c;一種情況是連續的最小的正數&#xff0c;一種是缺失連續但不是最小的正數驗證數組內數組是否連續&#xff0c;可以通過 nums[i]1 是否存nums組…

補題( Convolution, 二維卷積求輸出矩陣元素和最大值)

來源&#xff1a;https://codeforces.com/gym/105231/problem/H 題目描述&#xff1a; 一、題目分析 本題涉及深度學習中的二維卷積操作。給定一個nm的二維輸入矩陣I和一個kl的核矩陣K &#xff0c;通過特定公式計算得到(n - k 1)(m - l 1)的輸出矩陣O &#xff0c;要求在…

【Java ee初階】多線程(7)

一、線程池 線程池的一些參數&#xff1a; corePoolSize&#xff1a;核心線程數量 maximumPoolSize:核心線程數量臨時線程數量 上述是“java 的線程池策略”&#xff08;其他語言&#xff0c;其他庫的線程池可能不同&#xff09; keepAliveTime :臨時線程的存活時間.臨時線程…

Linux 常用指令詳解

Linux 操作系統中有大量強大的命令行工具&#xff0c;下面我將分類介紹一些最常用的指令及其用法。 ## 文件與目錄操作 ### 1. ls - 列出目錄內容 ls [選項] [目錄名] 常用選項&#xff1a; - -l&#xff1a;長格式顯示&#xff08;詳細信息&#xff09; - -a&#xff1a;顯…