一個網站系統,最重要的就是系統儲存的資料,我們在本地有開發用的資料庫,PythonAnywhere上面有一個SQLite的資料庫,隨著我們新增愈多的商家,就愈需要做好資料的備份。
今天我們會說明資料備份移轉的方式,並且使用Django的一些套件,來管理我們的系統。

匯出資料
python manage.py dumpdata --natural-foreign --natural-primary \
-e contenttypes -e auth -e admin -e sessions \
--indent 2 -o ./db/latest_db.json
--natural-foreign --natural-primary 這兩個參數跟資料的 PK(primary key) FK(foreign key)有關。PK 是資料在資料庫中獨一無二的編號,可能是整數或是UUID,就是流水號的概念。
在A資料表中,使用B資料表的PK,就稱作FK
Tag_Management 這個表中有兩個FK分別是Tag 和 Place,表示某一間店有某一個標籤。# food/models.py
class Tag_Management(models.Model):
**place** = models.**ForeignKey**(**Place**, on_delete=models.SET_NULL, null=True)
**tags** = models.**ForeignKey**(**Tag**, on_delete=models.SET_NULL, null=True)
假設資料庫A匯出的店家有一個pk=1 名叫覺丸拉麵,但是資料庫B已經有一個pk=1的小鳥不吃肉,這樣直接匯入資料的話,對應就會出錯,因此加上這個參數可以自動處理這個問題。
-e or --exclude 這是可以去除某些資料,像是session contenttypes,這種資料是暫時的不是很重要去除掉會比較好。auth admin 則是跟使用者資料有關,這是相對敏感的資料,所以在備份時需要注意。匯入資料
匯入資料就相對簡單,直接指定檔案的路徑即可。
python manage.py loaddata ./db/latest_db.json
實際使用方式
筆者會將開發過程新增的照片、新增的店家資料匯出,並且加入git之中,方便我們上傳至PythonAnywhere。
如果有自己的伺服器,比較好的做法是用 scp 指令將檔案上傳到伺服器中,再匯入資料,一個是減少git的檔案,一個是避免敏感資料外洩。
如果是在PythonAnywhere匯出資料,可以直接透過網頁下載。

直接在food/admin.py 加入下方程式碼
# food/admin.py
class PlaceAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'address', 'web_site', 'pub_date')
list_filter = ( 'pub_date','tags')
search_fields = ('name', 'address', 'web_site')
ordering = ('-id',)

ordering使用- 就表示將遞減排序。編輯Place時,可以看到Tag
使用 inlines,可以將Tag的介面嵌入在下方。
class TagInlineAdmin(admin.StackedInline):
model = Place.tags.through
class PlaceAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'address', 'web_site', 'pub_date')
list_filter = ('pub_date', 'tags')
search_fields = ('name', 'address', 'web_site')
ordering = ('-id',)
readonly_fields = ('pub_date',)
inlines = [TagInlineAdmin, ]
結果

完成了這個章節,更加感受到Django的方便與強大,這樣一來其實我們不用實作後台介面,就可以增減更新資料。
台南不需要米其林