Django 數據導入和導出

一,簡單的數據導出與導入(簡單的遷移)

1. django 項目提供了一個導出的方法 python manage.py dumpdata, 不指定 appname 時默認爲導出全部的appphp

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

好比咱們有一個項目叫 mysite, 裏面有一個 app 叫 blog ,咱們想導出 blog 的全部數據python

1
python manage.py dumpdata blog > blog_dump.json

2. 數據導入,不須要指定 appnamemysql

1
python manage.py loaddata blog_dump.json

備註:一些經常使用的sql

1
python manage.py dumpdata auth > auth.json  # 導出用戶數據

優勢:能夠兼容各類支持的數據庫,也就是說,之前用的是 SQLite3,能夠導出後,用這種方法導入到 MySQL, PostgreSQL等數據庫,反過來也能夠。shell

缺點:數據量大的時候,速度相對較慢,表的關係比較複雜的時候能夠導入不成功。數據庫

二,數據庫的遷移

2.1.  用 Django 自帶的命令django

好比早期咱們爲了開發方便,用的sqlite3數據庫,後來發現網站數據太多,sqlite3性能有點跟不上了,想換成postgreSQL,或者 MySQL的時候。json

若是還我還使用上面的命令,若是你運氣好的話,也許會導入成功,流程以下:bash

 

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 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
# 輸入密碼開始導入數據

注意:在cmd中執行導出命令時會出現錯誤:'mysqldump' 不是內部或外部命令,也不是可運行的程序或批處理文件。

解決辦法:進入MySQL的安裝目錄下,譬如我把mysql裝在了c盤,就到c:\mysql\bin下才能運行。文件存儲在數據庫相關的項目所在位置中。

總結:其它的數據庫,請自行搜索如何導入導出,整個數據庫導出的好處就是對數據之間的關係處理比較省事,好比自強學堂裏面的不少教程,上一篇和下一篇是一個一對一的關係,這樣的話用 python manage.py dumpdata 沒法導出教程與教程的關係,可是數據庫整個導出就沒有任何問題,固然也能夠寫一個腳本去導出關係再導入。Django 自帶的 python manage.py dumpdata 和 python manage.py loaddata 最大的好處就是能夠跨數據庫進行導入導出。

相關文章
相關標籤/搜索