Django筆記二十之手動編寫migration文件

来源:https://www.cnblogs.com/hunterxiong/archive/2023/04/09/17300914.html
-Advertisement-
Play Games

文章目錄一、前言一、方式1:spring 官方創建 springboot項目1、打開線上的 spring initializr2、選擇項目的語言、版本、依賴等3、 解壓源碼包,並使用IDEA打開4、測試介面二、方式2:社區idea安裝Spring插件1、添加插件三、方式3:(麻煩)手動maven 創 ...


本文首發於公眾號:Hunter後端
原文鏈接:Django筆記二十之手動編寫migration文件

前面介紹過,migration 文件主要記錄的是 Django 系統 model 的變化,然後通過 migrate 命令將變化適配到資料庫中。

比如在某個 application 下新增了某張表,或者對某張表更改了欄位,可以生成 migration 文件,然後通過 migrate 更改到資料庫。

除了系統能夠自動生成的,我們還可以手動創建 migration 文件來操作資料庫,這個用途主要是用於比如,創建表後,需要寫入一些初始化的數據的情況。

  1. 基礎命令
  2. migration文件介紹
  3. 自定義migration文件
  4. RunSQL()
  5. RunPython()

1、基礎命令

關於 migration 的命令有如下幾條:

  • makemigrations
  • migrate
  • sqlmigrate
  • showmigrations

其中 前面三條命令在第二篇筆記中已經介紹過使用方法,這裡介紹一下 showmigrations。

這個作用主要是查看某個 application 下的migration 文件是否已經被更改到資料庫中,可以在 Django 系統的根目錄用下麵的命令測試:

python3 manage.py showmigrations blog

可以看到下麵的輸出:

blog
 [X] 0001_initial
 [X] 0002_auto_20220118_0926
 [X] 0003_auto_20220121_1016

其中,前面的 [X] 表示已經被更改到資料庫中,如果我們再對 blog 的 model 進行任意修改,然後執行 makemigrations 的操作,再次執行 showmigrations 的操作,可以看到下麵的輸出:

blog
 [X] 0001_initial
 [X] 0002_auto_20220118_0926
 [X] 0003_auto_20220121_1016
 [ ] 0004_alter_book_price

可以看到最下麵的一條記錄 [] 中是沒有 X 的,表示這條 migration 文件沒有被執行 migrate。

2、migration文件介紹

每一次通過 makemigrations 生成的 migration 文件都存在系統中,一個最基礎的 migration 文件像下麵這樣:

from django.db import migrations, models


class Migration(migrations.Migration):


    dependencies = [('blog', '0001_initial')]


    operations = [
        migrations.DeleteModel('Tribble'),
        migrations.AddField('Author', 'rating', models.IntegerField(default=0)),
    ]

一個 Migration 的類下,有兩個參數,一個是 dependencies,一個是 operations

dependencies 作用是定位上一個執行的 migration 文件的地方,因為每一次 migrate 的執行都是按照順序的

且他的參數是一個列表,列表的元素是一個元組,裡面有兩個參數,一個是 application 的名稱,一個是上一次運行的 migration 文件,他是可以指定到多個 application 的,意義為在某兩個 application 的 migration 文件之後再執行

operations 的作用是 migration 里需要執行的操作,可以是欄位的增加、刪除、修改、也可以是表的創建和刪除

一個 migration 在執行 migrate 前,我們可以手動對其修改,甚至可以完全自己來定義

3、自定義migration文件

前面介紹了 migration 文件的基本結構,其中有一些關於欄位和 model 的操作方法,這些操作都可以通過 makemigration 的方式自動生成。

我們自定義的 migration 文件,與上面的保持一致即可,自定義的 migration 文件需要修改的地方是 operations 里的元素。

假設我們有這樣一個需求,創建一張基礎映射表後,裡面是系統運行所必需的數據,需要在創建表後立即寫入,那麼就用到了我們這個自定義的 migration 文件。

除了對錶欄位或者表的修改,還有兩種方法實現數據的寫入,

一種是使用 SQL 語句插入,用到的migration的函數是 RunSQL()

一種是使用 Django 的 ORM 語句,寫 python 的函數來插入,函數是 RunPython

假設創建 Blog 表的migration file 是 0001_create_blog.py

現在需要對其插入兩條數據,name 和 tagline 分別是 ('name_1', 'tagline_1') 和 ('name_2', 'tagline_2')

下麵用 RunSQL() 和 RunPython() 兩種方式來分別介紹。

4、RunSQL()

RunSQL() 函數接受一個字元串,或者一個數組作為參數,參數的內容都是 SQL 語句,這也是為什麼函數名為 RunSQL()。

字元串的形式為完整的 SQL 語句,比如我們需要插入這兩條數據,則是:

migrations.RunSQL(
	"INSERT INTO blog_blog (name, tagline) values('name_x_4', 'tagline_1'), ('name_x_5', 'tagline_2');"
)

如果是作為數組傳入,形式則是:

migrations.RunSQL(
    sql=[
        (
            "INSERT INTO blog_blog (name, tagline) values(%s, %s), (%s, %s);",
            ['name_x_6', 'tagline_1', 'name_x_7', 'tagline_2']
        )
    ]
)

在數組的傳入形式中,我們將需要插入的數據都放到一個數組中傳入

reverse_sql
RunSQL() 函數除了 sql 參數,還有一個 reverse_sql 參數,用途是 sql 參數執行的 SQL 語句沒有執行成功的情況下的一種操作,一般是用於防止數據污染。

假設說我們的 sql 為插入數據,但是因為某種原因,這條語句沒有正確插入,報錯了,那麼系統就會執行 reverse_sql 中的語句,作為一個可逆的操作。

以下是官方的一個使用示例:

migrations.RunSQL(
    sql=[("INSERT INTO musician (name) VALUES (%s);", ['Reinhardt'])],
    reverse_sql=[("DELETE FROM musician where name=%s;", ['Reinhardt'])],
)

5、RunPython()

RunSQL() 函數操作的是 SQL 語句,RunPython() 參數則是 Python 函數,可以將我們需要寫入的數據都寫到函數的步驟里,然後在 RunPython() 中調用

以下是使用示例:

def insert_blog_data(apps, schema_editor):
    Blog = apps.get_model("blog", "Blog")
    db_alias = schema_editor.connection.alias

    Blog.objects.using(db_alias).create(name="name_3", tagline="tagline_3")
    Blog.objects.using(db_alias).create(name="name_4", tagline="tagline_4")



class Migration(migrations.Migration):
    dependencies = [
        ("blog", "0001_initial"),
    ]


    operations = [
        migrations.RunPython(insert_blog_data)
    ]

其中,insert_blog_data 是需要執行的函數,在這個函數里,有兩個預設參數,apps 和 schema_editor

apps 可以用來獲取我們需要的 model,根據函數 apps.get_model(),

這個函數傳入兩個參數,一個是 application,我們這裡是 blog,

一個 model 的名稱,我們這裡是 Blog

而 schema_editor 則是可以用於獲取資料庫的 alias

然後,數據的插入的方式就和普通的 model 的操作方法一致了。

RunPython() 函數和 RunSQL 一樣,也可以輸入兩個參數,第二個參數作用也是用於操作失敗的回退操作:

migrations.RunPython(insert_blog_data, reverse_insert)

以上就是介紹 migration 的全部內容了,下一篇筆記將介紹如何在 Django 中使用原生的 SQL 來查詢數據。

如果想獲取更多後端相關文章,可掃碼關註閱讀:
image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 添加修飾 我們的房地產模塊現在從商業角度來看是有意義的。我們創建了特定的視圖,添加了幾個操作按鈕和約束。然而,我們的用戶界面仍然有點粗糙。我們希望為列表視圖添加一些顏色,並使一些欄位和按鈕有條件地消失。例如,當房產已出售或取消時,“已售出”和“取消”按鈕應消失,因為此時不再允許更改狀態。 參考: 文 ...
  • cargo、crates.io 本章內容 通過 release profile 來自定義構建 在https://crates.io/上發佈庫 通過 workspaces 組織大工程 從 https://crates.io/來安裝庫 使用自定義命令擴展 cargo 一、通過 release profi ...
  • 今天在學習springMVC的json數據綁定時,需要使用到jquery發送ajax請求。但是當我通過是<script>標簽引入了jquery.js。 但是當我訪問該jsp的時候就是不顯示頁面的內容 我一直以為時SpringMVC的servelt攔截器攔截了靜態資源,但是我過濾了靜態資源還是不顯示。 ...
  • 概念 異常處理的概念起源於早期的編程語言,如 LISP、PL/I 和 CLU。這些編程語言首次引入了異常處理機制,以便在程式執行過程中檢測和處理錯誤情況。異常處理機制隨後在 Ada、Modula-3、C++、Python、Java 等編程語言中得到了廣泛採用和發展。在 Java 中,異常處理是提供一 ...
  • 之前一直以為固態硬碟各方面都比機械硬碟性能高,所以首選固態硬碟,直到看了極客時間-深入淺出電腦組成原理中硬碟相關章節的內容,才發現固態硬碟原來是有缺點的,所以這裡來做一個總結。 機械硬碟(HDD) 機械硬碟由以下幾個部分組成: 盤面:盤面(碟片)上有一層磁性塗層,數據就是存儲在這個磁性的塗層上,一 ...
  • 網路分層結構 電腦網路體系大致分為三種,OSI七層模型、TCP/IP四層模型和五層模型。一般面試的時候考察比較多的是五層模型。最全面的Java面試網站 五層模型:應用層、傳輸層、網路層、數據鏈路層、物理層。 應用層:為應用程式提供交互服務。在互聯網中的應用層協議很多,如功能變數名稱系統DNS、HTTP協議 ...
  • 當今的軟體開發需要使用許多不同的工具和技術來確保代碼質量和穩定性。PMD是一個流行的靜態代碼分析工具,可以幫助開發者在編譯代碼之前發現潛在的問題。在本文中,我們將討論如何在Gradle中使用PMD,並介紹一些最佳實踐。 什麼是PMD? PMD是一個用於Java代碼的靜態代碼分析工具。它可以幫助開發者 ...
  • demo軟體園每日更新資源,請看到最後就能獲取你想要的: 1.完善版手游導航源碼app軟體 APP手機軟體 應用商城下載類網站佈局規整,利於用戶體驗 瀏覽網站看到一款帶後臺的app軟體手游類源碼,後臺功能強大,界面美觀,適用於app軟體,手機軟體下載,手游類導航網, 其他行業也可以把數據刪掉,添加自 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...