一般在使用django快速開發網站的時候,DB方面使用Sqlite3,對開發會方便很多

因為少掉了非常大量DB方面的設置,當然換個角度想,也算是在埋技術債啦

畢竟相對PostgreSQL,Sqlite3比較不適合用在營運環境上一點

但當系統早期建置時,需求相當不穩定下,與其追求DB的穩定,使用ORM,早點把系統雛形開發出來

再為了營運需求,使用更符合的DB也是個策略

而這篇最主要紀錄的,就是將Sqlite3上的資料快速的轉換到PostgreSQL上

可能方案

這邊介紹一些轉換方案,這些方案都會有適合他的情況,基本上可以挑狀況去用

至於我覺得最泛用的方法,寫在下方最終方案中

暴力法

用sqlite指令,直接dump資料,再把dump出來的資料格式轉成PostgreSQL看得懂的格式

或者也可以透過SQLiteStudio這樣的tool去dump資料

dump的格式、資料量,會是個大問題,再來如果資料有許多reference關西的話

資料輸出輸入的順序也不能有錯,比較適合在資料量小,schema單純的情況下用

但好處是,環境相依低,基本上各OS一定可以匯出匯入這些"格式正確"的資料

pgloader

可以直接讓PostgreSQL自己去讀取Sqlite3上面的資料

看說明是寫的很美好,但有個問題,就是windows上不是太好用

光是要把pgloader這個指令安裝起來就是個大問題

有些人是建議安裝Windows Subsystem for Linux,但這流程就會變得有點長了

但如果是在Linux based上的機器做轉換的話,pgloader應該還是個不錯的做法

最終方案

主要參考自這篇文章

簡單來說,就是使用Django指令把資料dump出來,再import回去

# 將資料全部倒到 datadump.json
python manage.py dumpdata > datadump.json
# 更改DB連線設定後,重新建立對應
python manage.py migrate --run-syncdb
# 開啟一個django的shell,並清掉一些設定資料
python manage.py shell
>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
>>> quit()
# 將資料倒回
python manage.py loaddata datadump.json

這樣就能很快地將資料進行移轉了

這個方法唯一的限制是,他是透過django指令,還有ORM機制來輔助的

所以系統如果不是用Django開發,ORM機制建立DB的話,就不能這樣轉換資料了