Django在作為一個開發架構,肯定會需要和資料庫關聯。我們以前學python基礎的時候,肯定了解過python的pymysql,可以連接配接mysql資料庫,并進行一些操作。但是Django提供了一套更簡單的架構用于操作資料庫,那就是ORM架構。
ORM内部其實也是封裝了pymysql類似的東西,隻不過ORM讓你操作資料庫的過程更簡單,不用再寫sql語句。
ORM環境配置
以前早一些的django版本ORM其實就是使用pymysql,是以就需要安裝pymysql:
pip install pymysql
也可以到settings.py的同級目錄中的init.py引入子產品并進行配置:
import pymysql
pymysql.install_as_MySQLdb()
如果使用的django版本比較新,就需要安裝mysqlclient:
pip install mysqlclient
準備資料庫
這裡需要提一下,ORM無法幫你建立資料庫,這個資料庫還是需要收到去進行建立。
資料庫可以用虛拟機或者雲服務:
建立資料庫
連接配接資料庫
到settings.py中找DATABASES,然後根據你使用的資料庫進行配置,預設其實有一個檔案資料庫的配置:
預設的資料庫配置
這裡使用mysql,可以這樣寫:
配置資料庫
操作表結構
以前要在資料庫中建表,或者修改表結構,都需要寫sql語句,這裡使用ORM,就不需要再寫sql語句了,直接建立與期望表結構對應的類就行,這個類需要繼承繼承models.Model,像這樣:
models.py
類寫好了當然不會自動去資料庫中建立,需要再執行兩個指令:
python manage.py makemigrations
python manage.py migrate
執行效果:
生成表結構
可以從執行日志中看到生成的表不僅僅隻有前面建立的UserInfo類。到資料庫中檢視:
生成的資料表
這是因為django預設有很多app,可以在settings.py中看到:
django中的app
這些app都會産生一些資料表。這裡提醒一下,如果app沒有在settings.py中注冊,在執行上面兩個指令的時候,是不會生成、更新資料庫表結構的。
可以看到UserInfo類對應的表結構:
app01_userinfo表結構
如果要修改表結構,隻需要修改UserInfo類的屬性,例如增加一個字段:
增加字段
執行指令:
python manage.py makemigrations
執行過程會詢問原資料在增加這個字段後要怎麼處理。第一種選擇是設定一個預設值,第二種選擇是停止目前指令執行,人為到models.py中設定一個預設值。
在models.py中設定預設值可以這樣操作:
設定預設值
當然,你也可以允許為空,或者将預設值設定成None或者空字元串,都是允許的。設定成允許為空、為null的參數如下:
允空、允null
再次執行指令,不會再有提示:
更新資料庫表結構
更新結果:
更新後的表結構
要删除某一個字段,也是一樣的操作,直接在類中删除對應字段,在執行指令就行。需要注意的一點是,删除某一個字段後,再次恢複這個字段,該字段對應的資料是不會恢複的。
操作資料-新增
需要對表裡的資料進行操作,也非常簡單。先準備一個繼承Model的類:
繼承Model的類
需要在Department類對應的表中新增資料時,可以直接這樣調用:
新增資料
當然也不能忘記配置對應的路由。運作起來後,調用這個接口後,就會在表中多一條資料:
新增的資料
新增的調用方法都是這樣的方式:
類名.objects.create(字段名=value)
操作資料-删除
如果要删除的話,可以這樣寫:
删除指定資料
其中filter方法的作用是按照特定條件進行過濾。
如果要删除某一個表的所有資料,可以使用all方法,像這樣:
删除表中所有資料
操作資料-查詢
實際工作中查詢其實是比較頻繁的,像前面使用的all方法,其實就是查詢目前表的所有資料,這樣改一下:
查詢表中所有資料
請求後擷取的内容是這樣的:
查詢結果
all方法傳回的其實是QuerySet類型的對象。
可以這樣改一下:
調整傳回的資料
實際生産中,一般是不會将資料庫查詢内容直接傳回給用戶端的,都是會做一些調整處理的。
再次調用,結果:
調用擷取到清單
當需要根據如此做更精細的查詢時,可以這樣改
根據入參進行查詢
也許有同學會有想,都已經根據很精确的條件進行查詢了,為什麼還要傳回一個清單。當你明确某個條件隻會查詢出一個資料時,可以使用first方法,當然建議對查詢結果進行判斷:
精确查詢
操作資料-更新
在掌握了前面查詢方法後,更新其實就非常簡單了,通過update方法就可以完成,像這樣:
更新資料
總結
Django的ORM值不值得學習和使用,這個是很多初學者會考慮的事,其實我感覺沒有必要,django會吸收orm,肯定是經過考慮的,用不着強調sql的實用性和某些人寫sql的經驗、能力。這裡也隻是介紹了一些基礎操作,orm的功能其實也很豐富,基本上sql能做到的事情,orm都能做到。
學習ORM對于有志成為一名curd工程師的同學來說,還是挺有意義的。