用 Django Fixture 匯入與導出資料
Let's Django!
這是 Django Tutorial 的第 7 篇,範例程式碼可參考我的 GitHub 專案。
本文相關的程式碼改動,都集中在這個 PR。
本文可視為 Django ORM 外鍵教學第三部分——查詢篇——的前置教學,因為我們需要一些範例資料作為查詢的標的。
為了快速且輕鬆地建立這些範例,我們要善用 Django fixture。
本文介紹 Django fixture 的基本用法,並以 Django-Tutorial 的範例資料為例,示範如何導出與匯入 fixture。
什麼是 Django Fixture
Django fixture 是一種用來管理資料庫數據的工具。
它允許你以 JSON 或 XML 等格式將資料庫中的數據導出(序列化)到特定文件中,並在需要時將這些數據匯入到資料庫。
你可以輕鬆地透過 Django fixture 初始化資料庫內容,設置測試數據,或者在不同環境間傳輸數據。
顯然的,它也很適合用來「快速建立」(或說匯入)我文章教學所需要的資料。
更多細節與介紹,可參考 Django 文件。
Django Fixture 的三大用途
Django fixture 主要有三種用途。我覺得第一種情況是最有實務價值的。
一、初始化資料庫
- 在開發或首次部署,用於建立資料庫中的初始數據。
- 常用於設定預設的用戶、權限或其他需要的基礎選項數據。
資料庫中總有一些,在專案部署階段就必須存在的資料。
比如「服務類型」為了未來的擴充彈性,選擇不寫成簡單的 enum(Django choices)欄位,而是直接獨立一個 db table,table 中的每一筆資料都是現有的服務類型。
而我們需要在首次部署時,把當前所有服務類型預先寫入 db,即資料初始化。
這個需求很常見,也很適合用 Django fixture 來處理。
二、測試
- 測試時用來準備一致的測試數據,確保測試的可靠性和可重現性。
- 測試資料可以被重複使用,不需要每次手動建立。
如果有用 pytest,基本上會被 pytest fixture 取代,我幾乎沒這麼用過。
三、資料的備份與還原
- 可以用來導出資料庫的部分或全部數據,方便做數據備份。
- 在需要時可以通過 fixture 還原資料庫的狀態。
備份大量資料顯然有更好、更標準的方式,所以這比較適合備份簡單的資料。
比如我們後續教學用的範例資料,恰好適合!
進入正題。
我們要為 Django Tutorial 的 models 建立一些簡單的範例資料。
建立範例資料並導出為 Fixture
這是建立資料的 Python script:
1 | from post.models import Post, Subtitle, Comment |
要使用這段程式碼來建立 db 實例,需要進入 Django shell 並執行程式碼。
我本來想用這種方式,讓讀者也可以自行建立資料並重現教學環境,但這樣的方式顯然不夠友好。
更好的方式是使用 Django fixture。
導出為 Fixture
一旦導出為 Django fixture,讀者只需要透過 Django 指令匯入,就可以重現整個 db 的資料環境,無疑是更好的選擇!
如何導出,使用dumpdata
指令:
1 | python manage.py dumpdata post --output=post_data.json |
可以用post
(Django app 名稱)來限定要輸出的 model 資料範圍。
如果不指定 app,dumpdata
指令會嘗試匯出整個專案的所有資料,包括 Django 本身的內建 db 資料。這通常包括大量不必要的內容,並且讓輸出文件變得過於複雜。
匯入 Fixture
輸出之後就是匯入,匯入也非常簡單,使用loaddata
指令:
1 | python manage.py loaddata post_data.json |
實際執行結果:
1 | ❯ python manage.py loaddata post_data.json |
會顯示總共匯入了幾筆資料,以及來源總共是幾筆 Django fixture(s)。
附帶一提,匯入之前,記得先確保已完成所有的 db 遷移!
1 | python manage.py migrate |