1. 程式人生 > >django 資料庫遷移

django 資料庫遷移

一,簡單的資料匯出與匯入(簡單的遷移)

1. django 專案提供了一個匯出的方法 python manage.py dumpdata, 不指定 appname 時預設為匯出所有的app

1 python manage.py dumpdata [appname] > appname_data.json

比如我們有一個專案叫 mysite, 裡面有一個 app 叫 blog ,我們想匯出 blog 的所有資料

1 python manage.py dumpdata blog > blog_dump.json

2. 資料匯入,不需要指定 appname

1 python manage.py loaddata blog_dump.json

備註:一些常用的

1 python manage.py dumpdata auth > auth.json  # 匯出使用者資料

優點:可以相容各種支援的資料庫,也就是說,以前用的是 SQLite3,可以匯出後,用這種方法匯入到 MySQL, PostgreSQL等資料庫,反過來也可以。

缺點:資料量大的時候,速度相對較慢,表的關係比較複雜的時候可以匯入不成功。

二,資料庫的遷移

2.1.  用 Django 自帶的命令

比如早期我們為了開發方便,用的sqlite3資料庫,後來發現網站資料太多,sqlite3效能有點跟不上了,想換成postgreSQL,或者 MySQL的時候。

如果還我還使用上面的命令,如果你運氣好的話,也許會匯入成功,流程如下:

 

2.1.1. 從原來的整個資料庫匯出所有資料

1 python manage.py dumpdata > mysite_all_data.json

2.1.2. 將mysite_all_data.json傳送到另一個伺服器或電腦上匯入

1 python manage.py loaddata mysite_all_data.json

 

如果你運氣好的話可能會匯入完成,但是往往不那麼順利,原因如下:

a) 我們在寫models的時候如果用到CharField,就一定要寫max_length,在sqlite3中是不檢查這個最大長度的,你寫最大允許長度為100,你往資料庫放10000個,sqlite3都不報錯,而且不截斷資料的長度,這似乎是slite3的優點,但是也給從sqlite3匯入其它資料庫帶來了困難,因為MySQL和PostgreSQL資料庫都會檢查最大長度,超出時就報錯!

 

b) Django 自帶的contentType會導致出現一些問題

用上面的方法只遷移一個app應該問題不大,但是如果有使用者,使用者組掛鉤,事情往往變得糟糕!如果匯入後沒有對資料進行修改,你可以考慮重新匯入,可能還要快一些,如果是手動在後臺輸入或者修改過,這種方法就不適用了

 

2.2, 用資料庫自帶的匯出匯入命令

預備知識:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 先輸入 mysql (比如 mysql -u root -p) 進入資料庫 shell   建立 GBK 格式的資料庫 zqxt create database `zqxt` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;   建立 UTF8 格式的資料庫 zqxt CREATE DATABASE `zqxt` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;   賦予資料庫(zqxt)許可權給某使用者,可以是已經存在的使用者或新使用者名稱 GRANT ALL PRIVILEGES ON zqxt.* TO  "任意使用者名稱" @ "localhost"  IDENTIFIED BY  "新密碼" ;   重新整理許可權 FLUSH PRIVILEGES;   退出資料庫shell EXIT;

 

假定 Django 用的資料庫名稱為 zqxt

2.2.1 在 PostgreSQL 中:

1 2 3 4 5 6 7 # 匯出資料庫 zqxt 到 zqxt.sql 檔案中 pg_dump zqxt > zqxt.sql   # 匯入資料庫到 新的伺服器 psql zqxt -f zqxt.sql   #注意:資料匯入匯出可能需要資料庫超級許可權,用 sudo su postgres 切換到資料庫超級使用者 postgres

2.2.2 在MySQL 中:

使用網頁工具,比如phpMyAdmin 匯入匯出很簡單,這裡就不說了,主要說一下命令列如何操作:

1 2 3 4 5 6 7 8 # 匯出資料庫 zqxt 到 zqxt.sql 檔案中 mysqldump -u username -p --database zqxt > zqxt.sql   # 匯入資料庫到 新的伺服器 (假設資料庫已經建立好) cat  /path/to/zqxt .sql | mysql -u username -p zqxt 或 mysql -u username -p zqxt <  /path/to/zqxt .sql 或 mysql -u username -p zqxt 進入 mysql shell 後,執行  source  /path/to/zqxt .sql # 輸入密碼開始匯入資料

總結:其它的資料庫,請自行搜尋如何匯入匯出,整個資料庫匯出的好處就是對資料之間的關係處理比較省事,比如自強學堂裡面的很多教程,上一篇和下一篇是一個一對一的關係,這樣的話用 python manage.py dumpdata 無法匯出教程與教程的關係,但是資料庫整個匯出就沒有任何問題,當然也可以寫一個指令碼去匯出關係再匯入。Django 自帶的 python manage.py dumpdata 和 python manage.py loaddata 最大的好處就是可以跨資料庫進行匯入匯出。