直到昨天我們才第一次對資料庫下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之間的橋樑!!