免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

Django更換數(shù)據(jù)庫(kù)和遷移數(shù)據(jù)方案

前言

雙十一光顧著買東西都沒(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
然后 , 事情往往沒(méi)有這么簡(jiǎn)單和順利 , 導(dǎo)出導(dǎo)入的過(guò)程中可能會(huì)遇到一些問(wèn)題 , 請(qǐng)繼續(xù)看~
導(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.permissioncontenttypes  , 這倆在 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ù)