前言

昨天我們看到了migrate一開始會去拿到相對應的connection物件也就是DatabaseWrapper,而拿到這個connection後具體要做什麼呢?今天就讓我們繼續往下捕捉migrate的動向!

正題

接續昨天的位置,今天會從MigrationExecutor開始~

這邊看到原本的connection又分別丟給了MigrationLoaderMigrationRecorder兩個class,看一下他們init時分別會做什麼事吧!
先從Loader開始

看註解,Loader會把分別在disk和database中的migration files load進來後進行操作~看來會分別和disk和databse做連接
接著看到最後一行self.build_graph()建立圖表?來看看這是在做什麼~

哦!看來是把migrations中的disk和database的data存到MigrationGraph中!
不過我們還是一個一個擊破!
首先是

會把我們在settings.pyINSTALLED_APPS的每個app中的migrations讀取進來,下面做了一些檔案的操作會把在app中的migrations裡面的py檔的Migration丟進dict存著

接著我們回到build_graph往下
接下來是load database data

MigrationRecorder前面好像也要看到,這邊不止new出來還call了applied_migrations從function名字我們也可以很輕易的了解他想做什麼了~我們進去看看這個function做了什麼事吧!

再往裡看has_table()

哦!!這裡的connection是誰還記得嗎!是sqlite3中的DatabaseWrapper看看cursor做了什麼~
我們可以在他的父類別BaseDatabaseWrapper找到,而with的原理需要google看文章了!提供一篇

再往裡

一樣一個一個看

看註解就可以知道會關掉有問題的連線~
往下移動

這邊的self.wrap_database_errors又是什麼呢?

這邊有些with的相關用法~先暫時把他理解為處理過程中遇到error的地方吧~
我們在回到ensure_connection()的下一個self.connect()

我們先把目標放在self.get_new_connection()這個function!
這邊要回到sqlite3的DatabaseWrapper

終於是看到連接database的地方啦!!

這個就是django/python跟sqlite3溝通的地方了!有機會再看看更底層連接的C語言吧~這個DB-API相關規範也都有寫在python的文件裡面!
接著再回到_cursor()

然後今天就先停在這邊吧!明天我們再接著繼續!!

現在停在紅色那點~

結語

稍微看一下今天的關鍵字

  • sqlite3 dbapi2
  • with 原理
  • disk 和 database 的graph(還沒看到)

migrate真的是很龐大,也終於是找到django和database的橋樑啦!!不過詳細的運作邏輯還是得去看python的原始碼看看python sqlite C 這三個怎麼串接的!不過我們這次主題是django這邊就不寫在鐵人賽了~