国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了Django筆記二十之手動編寫migration文件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文首發(fā)于公眾號:Hunter后端
原文鏈接:Django筆記二十之手動編寫migration文件

前面介紹過,migration 文件主要記錄的是 Django 系統(tǒng) model 的變化,然后通過 migrate 命令將變化適配到數(shù)據(jù)庫中。

比如在某個 application 下新增了某張表,或者對某張表更改了字段,可以生成 migration 文件,然后通過 migrate 更改到數(shù)據(jù)庫。

除了系統(tǒng)能夠自動生成的,我們還可以手動創(chuàng)建 migration 文件來操作數(shù)據(jù)庫,這個用途主要是用于比如,創(chuàng)建表后,需要寫入一些初始化的數(shù)據(jù)的情況。

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

1、基礎(chǔ)命令

關(guān)于 migration 的命令有如下幾條:

  • makemigrations
  • migrate
  • sqlmigrate
  • showmigrations

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

這個作用主要是查看某個 application 下的migration 文件是否已經(jīng)被更改到數(shù)據(jù)庫中,可以在 Django 系統(tǒng)的根目錄用下面的命令測試:

python3 manage.py showmigrations blog

可以看到下面的輸出:

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

其中,前面的 [X] 表示已經(jīng)被更改到數(shù)據(jù)庫中,如果我們再對 blog 的 model 進行任意修改,然后執(zhí)行 makemigrations 的操作,再次執(zhí)行 showmigrations 的操作,可以看到下面的輸出:

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

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

2、migration文件介紹

每一次通過 makemigrations 生成的 migration 文件都存在系統(tǒng)中,一個最基礎(chǔ)的 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 的類下,有兩個參數(shù),一個是 dependencies,一個是 operations

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

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

operations 的作用是 migration 里需要執(zhí)行的操作,可以是字段的增加、刪除、修改、也可以是表的創(chuàng)建和刪除

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

3、自定義migration文件

前面介紹了 migration 文件的基本結(jié)構(gòu),其中有一些關(guān)于字段和 model 的操作方法,這些操作都可以通過 makemigration 的方式自動生成。

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

假設(shè)我們有這樣一個需求,創(chuàng)建一張基礎(chǔ)映射表后,里面是系統(tǒng)運行所必需的數(shù)據(jù),需要在創(chuàng)建表后立即寫入,那么就用到了我們這個自定義的 migration 文件。

除了對表字段或者表的修改,還有兩種方法實現(xiàn)數(shù)據(jù)的寫入,

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

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

假設(shè)創(chuàng)建 Blog 表的migration file 是 0001_create_blog.py

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

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

4、RunSQL()

RunSQL() 函數(shù)接受一個字符串,或者一個數(shù)組作為參數(shù),參數(shù)的內(nèi)容都是 SQL 語句,這也是為什么函數(shù)名為 RunSQL()。

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

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

如果是作為數(shù)組傳入,形式則是:

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

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

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

假設(shè)說我們的 sql 為插入數(shù)據(jù),但是因為某種原因,這條語句沒有正確插入,報錯了,那么系統(tǒng)就會執(zhí)行 reverse_sql 中的語句,作為一個可逆的操作。

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

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

5、RunPython()

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

以下是使用示例:

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 是需要執(zhí)行的函數(shù),在這個函數(shù)里,有兩個默認參數(shù),apps 和 schema_editor

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

這個函數(shù)傳入兩個參數(shù),一個是 application,我們這里是 blog,

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

而 schema_editor 則是可以用于獲取數(shù)據(jù)庫的 alias

然后,數(shù)據(jù)的插入的方式就和普通的 model 的操作方法一致了。

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

migrations.RunPython(insert_blog_data, reverse_insert)

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

如果想獲取更多后端相關(guān)文章,可掃碼關(guān)注閱讀:
Django筆記二十之手動編寫migration文件文章來源地址http://www.zghlxwxcb.cn/news/detail-408859.html

到了這里,關(guān)于Django筆記二十之手動編寫migration文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Django筆記二十二之多數(shù)據(jù)庫操作

    Django筆記二十二之多數(shù)據(jù)庫操作

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十二之多數(shù)據(jù)庫操作 這一篇筆記介紹一下多數(shù)據(jù)庫操作。 在第十篇筆記的時候,簡單介紹過 using() 的使用方法,多個數(shù)據(jù)庫就是通過 using(db_alias) 的方式來來指定選中的數(shù)據(jù)庫,這里介紹一下同步庫表結(jié)構(gòu)時候的操作。 定

    2023年04月11日
    瀏覽(88)
  • Django筆記二十八之數(shù)據(jù)庫查詢優(yōu)化匯總

    Django筆記二十八之數(shù)據(jù)庫查詢優(yōu)化匯總

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十八之數(shù)據(jù)庫查詢優(yōu)化匯總 這一篇筆記將從以下幾個方面來介紹 Django 在查詢過程中的一些優(yōu)化操作,有一些是介紹如何獲取 Django 查詢轉(zhuǎn)化的 sql 語句,有一些是理解 QuerySet 是如何獲取數(shù)據(jù)的。 以下是本篇筆記目錄: 性

    2023年04月22日
    瀏覽(87)
  • Django筆記二十五之數(shù)據(jù)庫函數(shù)之日期函數(shù)

    Django筆記二十五之數(shù)據(jù)庫函數(shù)之日期函數(shù)

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十五之數(shù)據(jù)庫函數(shù)之日期函數(shù) 日期函數(shù)主要介紹兩個大類,Extract() 和 Trunc() Extract() 函數(shù)作用是提取日期,比如我們可以提取一個日期字段的年份,月份,日等數(shù)據(jù) Trunc() 的作用則是截取,比如 2022-06-18 12:12:12 ,我們可以根

    2023年04月19日
    瀏覽(93)
  • Django筆記二十七之數(shù)據(jù)庫函數(shù)之文本函數(shù)

    Django筆記二十七之數(shù)據(jù)庫函數(shù)之文本函數(shù)

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十七之數(shù)據(jù)庫函數(shù)之文本函數(shù) 這篇筆記將介紹如何使用數(shù)據(jù)庫函數(shù)里的文本函數(shù)。 顧名思義,文本函數(shù),就是針對文本字段進行操作的函數(shù),如下是目錄匯總: Concat() —— 合并 Left() —— 從左邊開始截取 Length() —— 獲取

    2023年04月22日
    瀏覽(95)
  • 【報錯】django.db.migrations.exceptions.NodeNotFoundError:

    從別處下載的Django源碼在搭建的過程中遇到的錯誤 django.db.migrations.exceptions.NodeNotFoundError: Migration users.0001_initial dependencies reference nonexistent parent node (‘a(chǎn)uth’, ‘0012_alter_user_first_name_max_length’) 依賴項引用不存在的父節(jié)點; 我遇到的是因為少編譯遷移了一個app,從而導(dǎo)致另個一

    2024年02月09日
    瀏覽(26)
  • Django筆記二十一之使用原生SQL查詢數(shù)據(jù)庫

    Django筆記二十一之使用原生SQL查詢數(shù)據(jù)庫

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十一之使用原生SQL查詢數(shù)據(jù)庫 Django 提供了兩種方式來執(zhí)行原生 SQL 代碼。 一種是使用 raw() 函數(shù),一種是 使用 connection.cursor()。 但是官方還是推薦在使用原生 SQL 之前,盡量的先去探索一下 QuerySet 提供的各種 API。 目前而言

    2023年04月10日
    瀏覽(98)
  • Django筆記二十六之數(shù)據(jù)庫函數(shù)之數(shù)學(xué)公式函數(shù)

    Django筆記二十六之數(shù)據(jù)庫函數(shù)之數(shù)學(xué)公式函數(shù)

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十六之數(shù)據(jù)庫函數(shù)之數(shù)學(xué)公式函數(shù) 這一篇來介紹一下公式函數(shù),主要是數(shù)學(xué)公式。 其中 sin,cos 這種大多數(shù)情況下用不上的就不介紹了,主要介紹下面幾種: Abs() 絕對值 Ceil() 向上取整 Floor() 向下取整 Mod() 取余 Power() 乘方

    2023年04月20日
    瀏覽(93)
  • Django筆記二十四之數(shù)據(jù)庫函數(shù)之比較和轉(zhuǎn)換函數(shù)

    Django筆記二十四之數(shù)據(jù)庫函數(shù)之比較和轉(zhuǎn)換函數(shù)

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十四之數(shù)據(jù)庫函數(shù)之比較和轉(zhuǎn)換函數(shù) 這一篇筆記開始介紹幾種數(shù)據(jù)庫函數(shù),以下是幾種函數(shù)及其作用 Cast 轉(zhuǎn)換類型 Coalesce 優(yōu)先取值 Greatest 返回較大值 Nullif 值相同返回 None 這一篇筆記我們主要用到 Author 和 Entry model 作為示

    2023年04月18日
    瀏覽(96)
  • Django筆記二十三之case、when操作條件表達式搜索、更新等操作

    Django筆記二十三之case、when操作條件表達式搜索、更新等操作

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:Django筆記二十三之條件表達式搜索、更新等操作 這一篇筆記將介紹條件表達式,就是如何在 model 的使用中根據(jù)不同的條件篩選數(shù)據(jù)返回。 這個操作類似于數(shù)據(jù)庫中 if elif else 的邏輯。 以下是本篇筆記的目錄: model 和數(shù)據(jù)準備 When 和

    2023年04月13日
    瀏覽(28)
  • 在Django項目中的各個應(yīng)用中分別編寫路由配置文件urls.py

    在Django項目中的各個應(yīng)用中分別編寫路由配置文件urls.py

    在博文: https://blog.csdn.net/wenhao_ir/article/details/131166889 中,已經(jīng)講述了怎么創(chuàng)建項目和應(yīng)用,這里直接給出命令: 找開文件:learn001urls.py 把原代碼: 改為: 在路徑: 下新建文件 urls.py 然后寫入下面的內(nèi)容: 在路徑: 下新建文件 urls.py 然后寫入下面的內(nèi)容: 三個views.py 文

    2024年02月09日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包