<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天來分享一下 Django 專案切換資料庫和遷移資料的方案,網路上找到的文章方法不一,且使用中容易遇到各類報錯,本文根據 Django 官方檔案和工作中的經驗,穩定可靠,在部落格中長期更新~
如果你遇到同樣的問題,閱讀本文應該能得到比較好的解決方案。
Django 預設使用 SQLite 資料庫方便開發,同時其 ORM 支援多種資料庫,只要安裝對應的驅動就行。
切換資料庫一般是將開發環境的 SQLite 切換到 MySQL (MariaDB) 或 PostgreSql ,本文只測試了從 SQLite 到 MySQL / PostgreSQL,同理,其他切換路徑也是可以的。
資料庫的表結構沒啥問題,使用 Django 的 migrate 功能就行了
關鍵在於資料遷移,可以使用 Navicat 之類的資料庫工具進行資料同步,但往往會因為表之間的約束關係導致同步失敗(要求按特定順序匯入資料)。
所以最好的方法是使用 Django 的 dumpdata
功能,將資料庫匯出為 json 或 xml 檔案,然後切換資料庫再匯入。
步驟如下:
python manage.py dumpdata -o db.json
settings.py
裡切換到新的資料庫python manage.py migrate
python manage.py loaddata db.json
搞定~
附上幾種資料庫設定,方便使用
db_config = { 'sqlite': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'OPTIONS': { 'timeout': 20, } }, 'pgsql': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': '資料庫名稱', 'USER': '使用者名稱', 'PASSWORD': '密碼', 'HOST': '資料庫伺服器地址', 'PORT': 5432, }, 'mysql': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '資料庫名稱', 'USER': '使用者名稱', 'PASSWORD': '密碼', 'HOST': '資料庫伺服器地址', 'PORT': 3306, } } # 這裡可以方便切換不同資料庫 DATABASES = {'default': db_config['pgsql']}
其中:
mysqlclient
包psycopg2
包然後,事情往往沒有這麼簡單和順利,匯出匯入的過程中可能會遇到一些問題,請繼續看~
報錯資訊
CommandError: Unable to serialize database: 'gbk' codec can't encode character 'u30fb' in position 4: illegal multibyte sequence
原因跟編碼有關
使用 Python 的 UTF-8 模式匯出資料就沒問題
用這個命令匯出檔案
(不匯出 auth.permission
和 contenttypes
,這倆在 migrate
時會自動生成,這樣避免了匯入原有資料時衝突)
python -Xutf8 manage.py dumpdata --exclude auth.permission --exclude contenttypes > db.json
或者
python -Xutf8 manage.py dumpdata -o db.json
django.db.utils.IntegrityError: Problem installing fixture 'db.json' Could not load contenttypes.ContentType(pk=15): (1062, "Duplicate entry 'xxx' for key 'django_content_type.django_content_type_app_label_model_76bd3d3b_uniq'")
加上這倆引數
--natural-primary
: Omits the primary key in the serialized data of this object since it can be calculated during deserialization.--natural-foreign
: Uses the natural_key() model method to serialize any foreign key and many-to-many relationship to objects of the type that defines the method.作用是匯出的時候去除一些約束,匯入時會自動處理,減少匯入時因為表之間約束關係的問題
python3 manage.py dumpdata --natural-primary --natural-foreign -o db.json
content_type
資料另一種思路,把 migrate
過程產生的初始化資料刪了,避免匯入時和原有資料衝突
先進入 python shell
python3 manage.py shell
輸入以下Python程式碼執行
from django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete()
UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xff in position 0: invalid start byte in Django
在匯入命令前面加上 -Xutf8
引數
python -Xutf8 manage.py loaddata db.json
能用,但不推薦,實在沒辦法再來試這個方法
修改檔案
libsite-packagesdjangocoreserializersjson.py
在 Deserializer
方法中找到這行程式碼
stream_or_string = stream_or_string.decode()
改成這樣
stream_or_string = stream_or_string.decode('UTF-16')
再進行匯入操作
到此這篇關於Django切換資料庫和遷移資料詳解的文章就介紹到這了,更多相關Django切換資料庫和遷移資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45