前言

直到昨天我們才第一次對資料庫下migrate,什麼是migrate?而migrate又是會做什麼事呢?django的migrate指令會根據我們寫的一些檔案生成對應的SQL後對資料庫進行操作,而具體的檔案會是由makemigrations生成,django會根據migrations資料夾內的檔案對我們自己撰寫的table也就是models.py做版控,而一開始的migrate會根據django預設migrations內的檔案做驗證確認後才寫進資料庫!聽起來不容易呢,有很多細微的操作!接著就讓我們潛下去python manage.py migrate來看看細部的內容吧~

正題

老熟了,我們就到django.core.management.commands中找到對應的檔案吧!不過以防萬一我們還是驗證一下是不是真的是這個位置!<django.core.management.commands.migrate.Command object at 0x000001C327463D50>沒問題是對的!

這個原始碼的長度看了一下就知道大事不妙了!需要慢慢拆解來看~那就邊看註解邊讀原始碼吧!
首先看到的是

這邊說實際的我沒有很清楚這樣做的目的,看註解是把所有相關的app.management import進來,為了處理events?可能需要再詳細研究看看~
接著是

先來看看connections是怎麼來的吧!

繼續挖

上次有介紹過的magic method,這邊是用在BaseConnectionHandler中的__getitem__這個magic method來處理

可以看到他會去create一個connection我們在往裡面看,create_connection()要回到ConnectionHandler來看

此時這邊會根據我們在settings設定的DATABASEDS中的ENGINE去找到相對應的db,然後回傳該DB的DatabaseWrapper物件,我們再接著看一下DatabaseWrapper是什麼?那因為我是用預設的sqlite,我們就根據load_backend()這個線索找到sqlite的資料夾放在哪~

django.db.backends.sqlite3.base

之後我們在前面migrate的時候使用的connection就可以知道他會是sqlite中的DatabaseWrapper囉!
接著我們在回到migrate的下面一個

根據剛剛的結果我們可以知道他會是DatabaseWrapper的function

這個我自己看了看他是沒有被使用到的,具體有沒有做其他我不清楚的操作不確定!
今天大概就先到這邊~明天就從這裡開始接續~

結語

migrate會碰到資料庫的地方也是我一直很好奇的部分,到底django的orm是怎麼跟database做溝通的呢!?藉由這次機會就來好好的研究研究,剛好明天中秋節放假,可以有很多時間來探明django與database之間的橋樑!!