前言
雙十一光顧著買東西都沒(méi)怎么寫文章 , 現(xiàn)在筆記里還有十幾篇半成品文章沒(méi)寫完…今天來(lái)分享一下 Django 項(xiàng)目切換數(shù)據(jù)庫(kù)和遷移數(shù)據(jù)的方案 , 網(wǎng)絡(luò)上找到的文章方法不一 , 且使用中容易遇到各類報(bào)錯(cuò) , 本文根據(jù) Django 官方文檔和工作中的經(jīng)驗(yàn) , 穩(wěn)定可靠 , 在博客中長(zhǎng)期更新~
如果你遇到同樣的問(wèn)題 , 閱讀本文應(yīng)該能得到比較好的解決方案 。
基本步驟Django 默認(rèn)使用 SQLite 數(shù)據(jù)庫(kù)方便開(kāi)發(fā) , 同時(shí)其 ORM 支持多種數(shù)據(jù)庫(kù) , 只要安裝對(duì)應(yīng)的驅(qū)動(dòng)就行 。
切換數(shù)據(jù)庫(kù)一般是將開(kāi)發(fā)環(huán)境的 SQLite 切換到 MySQL (MariaDB) 或 PostgreSql , 本文只測(cè)試了從 SQLite 到 MySQL / PostgreSQL , 同理 , 其他切換路徑也是可以的 。
數(shù)據(jù)庫(kù)的表結(jié)構(gòu)沒(méi)啥問(wèn)題 , 使用 Django 的 migrate 功能就行了
關(guān)鍵在于數(shù)據(jù)遷移 , 可以使用 Navicat 之類的數(shù)據(jù)庫(kù)工具進(jìn)行數(shù)據(jù)同步 , 但往往會(huì)因?yàn)楸碇g的約束關(guān)系導(dǎo)致同步失敗(要求按特定順序?qū)霐?shù)據(jù)) 。
所以最好的方法是使用 Django 的
dumpdata 功能 , 將數(shù)據(jù)庫(kù)導(dǎo)出為 json 或 xml 文件 , 然后切換數(shù)據(jù)庫(kù)再導(dǎo)入 。步驟如下:
- 導(dǎo)出原有數(shù)據(jù):
python manage.py dumpdata -o db.json - 在目標(biāo)數(shù)據(jù)庫(kù)(MySQL / PostgreSql)里創(chuàng)建一個(gè)空的庫(kù)
- 在
settings.py里切換到新的數(shù)據(jù)庫(kù) - 建立新的數(shù)據(jù)庫(kù)表結(jié)構(gòu)
python manage.py migrate - 導(dǎo)入原有數(shù)據(jù):
python manage.py loaddata db.json
附上幾種數(shù)據(jù)庫(kù)配置 , 方便使用
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': '數(shù)據(jù)庫(kù)名稱','USER': '用戶名','PASSWORD': '密碼','HOST': '數(shù)據(jù)庫(kù)服務(wù)器地址','PORT': 5432,},'mysql': {'ENGINE': 'django.db.backends.mysql','NAME': '數(shù)據(jù)庫(kù)名稱','USER': '用戶名','PASSWORD': '密碼','HOST': '數(shù)據(jù)庫(kù)服務(wù)器地址','PORT': 3306,}}# 這里可以方便切換不同數(shù)據(jù)庫(kù)DATABASES = {'default': db_config['pgsql']}其中:- MySQL 需要安裝
mysqlclient包 - PostgreSql 需要安裝
psycopg2包
導(dǎo)出報(bào)錯(cuò)報(bào)錯(cuò)信息
CommandError: Unable to serialize database: 'gbk' codec can't encode character '\u30fb' in position 4: illegal multibyte sequence原因跟編碼有關(guān)解決方法使用 Python 的 UTF-8 模式導(dǎo)出數(shù)據(jù)就沒(méi)問(wèn)題
用這個(gè)命令導(dǎo)出文件
(不導(dǎo)出
auth.permission 和 contenttypes , 這倆在 migrate 時(shí)會(huì)自動(dòng)生成 , 這樣避免了導(dǎo)入原有數(shù)據(jù)時(shí)沖突)python -Xutf8 manage.py dumpdata --exclude auth.permission --exclude contenttypes > db.json或者python -Xutf8 manage.py dumpdata -o db.json導(dǎo)入過(guò)程出錯(cuò)解決報(bào)錯(cuò)1: Duplicate entry報(bào)錯(cuò)信息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'")解決方法一: 重新導(dǎo)出數(shù)據(jù)加上這倆參數(shù)--natural-primary: Omits the primary key in the serialized data of this object since it can be calculated during deserialization.--natural-foreign經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀
- iPhone15將被強(qiáng)制使用USB-C 你支持更換USB-C嗎
- MySQL數(shù)據(jù)庫(kù)的性能分析 ---圖書《軟件性能測(cè)試分析與調(diào)優(yōu)實(shí)踐之路》-手稿節(jié)選
- Django的簡(jiǎn)單使用
- rabbitmq docker安裝消息隊(duì)列及數(shù)據(jù)庫(kù)(mongo、mysql)
- 華為watch3pronew怎么更換表帶 華為watch3pronew更換表帶操作方法
- 如何更換彩鈴鈴聲(6元彩鈴怎么退訂)
- 雙層玻璃門碎了一面怎么更換
- 無(wú)期迷途監(jiān)管對(duì)象怎么更換
- 地漏怎么更換?
- django-environ學(xué)習(xí)
