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 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 最大的好處就是可以跨數據庫進行導入導出。
轉載于:https://www.cnblogs.com/xyyhcn/p/10775158.html
總結
以上是生活随笔為你收集整理的Django 数据导入和导出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 橙光游戏《斗罗大陆》攻略
- 下一篇: 桃花源记中的一词多义