雖然好像用django通常就會直接搭配django的ORM下去開發,但本人我第一個自己開發的程式中就是一開始沒有使用djangoORM而且還把所有頁面都寫在同一個app同一個view裡面,然後在那個view裡面又組了一大堆的raw sql,再加上那時候程式能力很差完全沒有規劃只想把功能做出來,導致裡面一堆重複的地方,一想到就覺得好恐怖,不過好像扯遠了XD
就是說在初期開發下沒使用ORM又或是需要把現有資料庫的table轉移至django並使用ORM這樣的需求,而django剛好有提供一個指令可以讓你簡單的就把models的輪廓生出來!!今天就來看看這個神奇的指令吧!
python manage.py inspectdb
我們就來看看會生出什麼樣的models吧!
首先先準備好一個db
我這邊就用我們前幾次生成的db.sqlite3
而他的原始models.py長這樣
from django.db import models
# Create your models here.
class Person(models.Model):
name = models.CharField(max_length=255)
class Meta:
db_table = 'person'
class Todo(models.Model):
title = models.CharField(max_length=255)
complete = models.BooleanField(default=False)
class Meta:
db_table = 'todolist'
接著我們直接下指令python manage.py inspectdb
會跳出這些訊息
跟著他上面的指示走,而下面就是我們目標的models.py,當然這充其量只是django根據database中的table資訊去生成的,詳細的內容還是需要確認調整過,那因為我們範例很簡單所以基本上是一模一樣~
身為菜鳥工程師的我不得不說,還真沒辦法想像裡面做了什麼事!!
既然沒辦法想像,那我們就直接看他怎麼做的!
老樣子直接找commands
看起來有點少呢,就來看看這個for loop的funtion吧!
connection也是老朋友了,詳細可以看這篇
這邊使用到yield,python的yield可以讓一個可迭代的物件先暫時停止並return,下次在從yield的地方往下執行,我把它理解為暫時中離,參考資料
那他yield的內容是不是很熟悉啊~沒錯!就是我們輸入inspectdb後一開始出現的那幾行指引教學!
而這樣看起來就是外面的for loop會把yield的內容接起來後先執行self.stdout.write(line)
那我們繼續往下看connection.introspection.get_table_list(cursor)
好像也有看過呢~這邊這邊
接下來的內容大致上就是把database裡的資訊轉換成字串的過程後全部丟給這
這邊又出現了一個陌生的東西yield from
google看看,參考文章,我可能還需要一點時間理解QQ,我們先往下看self.get_meta()
淺顯易懂得就是處理models中meta的部分~
最外層的for loop就會把database的table一個一個跑過後,把table的colums一個一個比對生成,最後在去組meta得部分,結果就像我們下指令後得到的樣子!
django其實commands稍微看了一下有很多沒看過也不知道什麼情況會用到呢,這個inspectdb也是因為我想要重寫之前那的很恐怖的程式才突發奇想找看看有沒有可以轉化的東西,沒想到還真的有~