国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

django使用多個數(shù)據(jù)庫實現(xiàn)

這篇具有很好參考價值的文章主要介紹了django使用多個數(shù)據(jù)庫實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、說明:

  在開發(fā) Django 項目的時候,很多時候都是使用一個數(shù)據(jù)庫,即 settings 中只有 default 數(shù)據(jù)庫,但是有一些項目確實也需要使用多個數(shù)據(jù)庫,這樣的項目,在數(shù)據(jù)庫配置和使用的時候,就比較麻煩一點。

二、Django使用多個數(shù)據(jù)庫中settings中的DATABASES的設(shè)置

  2.1 默認(rèn)只是用一個數(shù)據(jù)庫時 DATABASES 的設(shè)置(以 SQLite 為例)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',         
        'NAME': 'db.sqlite3',
    }
}

  2.2 Django 數(shù)據(jù)庫支持的?ENGINE 類型

    • 'django.db.backends.postgresql'
    • 'django.db.backends.mysql'
    • 'django.db.backends.sqlite3'
    • 'django.db.backends.oracle'

  2.3 設(shè)置了多個數(shù)據(jù)庫后 settings 中的 DATABASES 的設(shè)置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'db.sqlite3',
    },
    'db1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql_test_db1',
        'USER': 'root',
        'PASSWORD': 'Se7eN521',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    },
    'db2': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql_test_db2',
        'USER': 'root',
        'PASSWORD': 'Se7eN521',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}

三、實現(xiàn)思路

  1. 多個應(yīng)用對應(yīng)多個數(shù)據(jù)庫和一個應(yīng)用對應(yīng)多個數(shù)據(jù)庫
    1. 情況一:項目有多個 應(yīng)用app 且需要使用到多個數(shù)據(jù)庫
    2. 情況二:項目只有一個應(yīng)用app, 且但需要使用到多個數(shù)據(jù)庫,
  2. 這兩種情況的實現(xiàn)思路其實都是一樣的,都是為每個數(shù)據(jù)庫創(chuàng)建一個應(yīng)用,即這個應(yīng)用只對接一個數(shù)據(jù)庫,如果這個應(yīng)用不需要寫任何業(yè)務(wù)邏輯的代碼,也需要創(chuàng)建一個空的應(yīng)用,主要是用來做數(shù)據(jù)庫遷移的
  3. 核心思想就是:一個model類對應(yīng)一個數(shù)據(jù)庫,通過數(shù)據(jù)庫路由和model定義時指定的all_label來實現(xiàn)。

四、案例實現(xiàn)

  第一步:創(chuàng)建需要的 應(yīng)用app,并且在?INSTALLED_APPS 中引用

    其中db1_app這個應(yīng)用主要是用來對接數(shù)據(jù)庫db1的

    其中db2_app這個應(yīng)用主要是用來對接數(shù)據(jù)庫db2的

    其中test_app這個應(yīng)用主要用來實現(xiàn)業(yè)務(wù)邏輯的

? ? ? ? ? ? ? ? ?django使用多個數(shù)據(jù)庫實現(xiàn)

  第二步:創(chuàng)建 應(yīng)用app 和 數(shù)據(jù)庫之間的映射關(guān)系

    在settings.py 文件夾中設(shè)置?DATABASE_APPS_MAPPING?的字典,里面主要是配置 應(yīng)用app 和數(shù)據(jù)庫的對應(yīng)關(guān)系

DATABASE_APPS_MAPPING = {
    "db1_app": "db1",   # db1_app 對應(yīng) db1 數(shù)據(jù)庫
    "db2_app": "db2"    # db2_app 對應(yīng) db2 數(shù)據(jù)庫
}

  第三步:創(chuàng)建數(shù)據(jù)庫路由

    在項目的主文件夾即 settings.py 的同目錄下創(chuàng)建一個?database_router.py 文件,該文件的作用就是給不同應(yīng)用app 配置不同的數(shù)據(jù)庫。

# _*_ coding:utf-8 _*_
# @Time : 2023/4/20 5:37 下午

from django.conf import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
print('DATABASE_MAPPING = {}'.format(DATABASE_MAPPING))

class DatabaseAppsRouter(object):

    # 設(shè)置 應(yīng)用app 讀取時數(shù)據(jù)庫的設(shè)置
    def db_for_read(self, model, **hints)if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return False
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure that apps only appear in the related database.
        根據(jù)app_label的值只在相應(yīng)的數(shù)據(jù)庫中創(chuàng)建一個表,如果刪除該def或
        不指定過濾條件,則一個Model會在每個數(shù)據(jù)庫里都創(chuàng)建一個表。
        """
        if db in DATABASE_MAPPING.values():return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        return None

  第四步:在setting.py中配置 DATABASE_ROUTERS 指定自由路由文件:

#test_django為項目名,database_router為路由文件名,DatabaseAppsRouter為路由中創(chuàng)建的類名
DATABASE_ROUTERS = ['django_db_demo.database_router.DatabaseAppsRouter']

  第五步:創(chuàng)建model類

    說明:model 可以根據(jù)需要卸載任何一個應(yīng)用app的model.py文件中,也可以分散寫在多個應(yīng)用的model.py中,這個根據(jù)自己的需要即可,但是如何推薦一定要在model類的Meta中指定app_label。不然會全部將表創(chuàng)建到default數(shù)據(jù)庫中

from django.db import models

class SqliteModel(models.Model):
    """帳號和用戶關(guān)聯(lián)"""

    sqlite_name = models.CharField(max_length=20)
    class Meta:
        # 當(dāng)前這個 SqliteModel 定義的數(shù)據(jù)庫的表將會創(chuàng)建在test_app 對應(yīng)的default 數(shù)據(jù)庫中
        app_label = "test_app"      # 當(dāng)有多個數(shù)據(jù)庫鏈接的時候,要通過app_label 來區(qū)分這個model對應(yīng)那個數(shù)據(jù)庫
   
class Db1Model(models.Model):
    """帳號和用戶關(guān)聯(lián)"""

    db1_name = models.CharField(max_length=20)
    class Meta:
        # 當(dāng)前這個Db1Model 定義的數(shù)據(jù)庫的表將會創(chuàng)建在 db1_app 對應(yīng)的 db1 數(shù)據(jù)庫中
        app_label = "db1_app"        # 當(dāng)有多個數(shù)據(jù)庫鏈接的時候,要通過app_label 來區(qū)分這個model對應(yīng)那個數(shù)據(jù)庫
       
class Db2Model(models.Model):
    """帳號和用戶關(guān)聯(lián)"""

    db2_name = models.CharField(max_length=20)
    class Meta:
        # 當(dāng)前這個Db2Model 定義的數(shù)據(jù)庫的表將會創(chuàng)建在 db2_app 對應(yīng)的 db1 數(shù)據(jù)庫中
        app_label = "db2_app"       # 當(dāng)有多個數(shù)據(jù)庫鏈接的時候,要通過app_label 來區(qū)分這個model對應(yīng)那個數(shù)據(jù)庫
      

  

  第六步:數(shù)據(jù)遷移

python3 manage.py makemigrations  
python3 manage.py migrate --database=default   # 當(dāng)有多個數(shù)據(jù)庫,需要遷移多次
python3 manage.py migrate --database=db1
python3 manage.py migrate --database=db2 

  第七步:查看遷移:

    model對應(yīng)的表,分別遷移到不同的數(shù)據(jù)庫成功,剩下的增刪改查的就正常引入model對象即可,這樣就實現(xiàn)了,不同的model對象,對應(yīng)不用數(shù)據(jù)庫的表。

    django使用多個數(shù)據(jù)庫實現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-420224.html

第五步:總結(jié)

  1. 創(chuàng)建多個數(shù)據(jù)庫連接設(shè)置
  2. 創(chuàng)建多個數(shù)據(jù)與應(yīng)用app的映射關(guān)系
  3. 創(chuàng)建數(shù)據(jù)庫路由
  4. 創(chuàng)建model類的時候置指明app_label,即這個model是屬于那個app,從而覺得遷移到那個數(shù)據(jù)庫

到了這里,關(guān)于django使用多個數(shù)據(jù)庫實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 基于SpringBoot 2+Layui實現(xiàn)的管理后臺系統(tǒng)源碼+數(shù)據(jù)庫+安裝使用說明

    基于SpringBoot 2+Layui實現(xiàn)的管理后臺系統(tǒng)源碼+數(shù)據(jù)庫+安裝使用說明

    一個基于SpringBoot 2 的管理后臺系統(tǒng),包含了用戶管理,組織機(jī)構(gòu)管理,角色管理,功能點管理,菜單管理,權(quán)限分配,數(shù)據(jù)權(quán)限分配,代碼生成等功能 相比其他開源的后臺系統(tǒng),SpringBoot-Plus 具有一定的復(fù)雜度 系統(tǒng)基于Spring Boot2.1技術(shù),前端采用了Layui2.4。數(shù)據(jù)庫以MySQL/Oracle

    2024年02月04日
    瀏覽(32)
  • python在Django中,如何使用MySQL數(shù)據(jù)庫進(jìn)行分頁怎么實現(xiàn)

    在Django中,使用MySQL數(shù)據(jù)庫進(jìn)行分頁是一個相對簡單的任務(wù)。Django的ORM提供了內(nèi)置的分頁功能,你只需要使用Paginator類即可。以下是一個基本的示例,展示了如何在Django中使用MySQL進(jìn)行分頁: 首先,確保你已經(jīng)安裝了Django和MySQL,并且已經(jīng)配置了Django項目以使用MySQL數(shù)據(jù)庫。

    2024年04月29日
    瀏覽(20)
  • 【W(wǎng)eb開發(fā) | Django】數(shù)據(jù)庫分流之道:探索Django多數(shù)據(jù)庫路由最佳實踐

    【W(wǎng)eb開發(fā) | Django】數(shù)據(jù)庫分流之道:探索Django多數(shù)據(jù)庫路由最佳實踐

    ???♂? 個人主頁: @AI_magician ??主頁地址: 作者簡介:CSDN內(nèi)容合伙人,全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者。 ?????景愿:旨在于能和更多的熱愛計算機(jī)的伙伴一起成長??!????? ???♂?聲明:本人目前大學(xué)就讀于大二,研究興趣方向人工智能硬件(雖然硬件還沒開始玩,但一直

    2024年02月07日
    瀏覽(196)
  • Web開發(fā):django+前端+數(shù)據(jù)庫(7)

    Web開發(fā):django+前端+數(shù)據(jù)庫(7)

    Python知識點:函數(shù)、面向?qū)ο?前端開發(fā):HTML、CSS、Javascript、jQuery、Bootstrap MySQL數(shù)據(jù)庫 Python的Web框架:Flask和Django 1.? 安裝django pip install django 2.? 創(chuàng)建項目 專業(yè)版的pycharm可以直接創(chuàng)建django項目,如果時社區(qū)版的pycharm可以參考一下這篇博客(http://t.csdnimg.cn/aMlBu),直接從終

    2024年02月21日
    瀏覽(23)
  • 軟件開發(fā)項目文檔系列之八數(shù)據(jù)庫設(shè)計說明書

    軟件開發(fā)項目文檔系列之八數(shù)據(jù)庫設(shè)計說明書

    數(shù)據(jù)庫設(shè)計說明書是一個關(guān)鍵文檔,它提供了有關(guān)數(shù)據(jù)庫的詳細(xì)信息,包括設(shè)計、結(jié)構(gòu)、運行環(huán)境、數(shù)據(jù)安全、管理和維護(hù)等方面的內(nèi)容。 引言部分,簡要介紹數(shù)據(jù)庫設(shè)計說明書的目的和內(nèi)容。這部分通常包括以下內(nèi)容: 引言的目的:解釋為什么需要數(shù)據(jù)庫設(shè)計說明書,它

    2024年02月06日
    瀏覽(20)
  • django框架——實現(xiàn)MySQL數(shù)據(jù)庫數(shù)據(jù)的刪除

    在html中的刪除按鈕中綁定js文件中的事件,帶上參數(shù),點擊即觸發(fā)(刪除按鈕不能是a鏈接,不然報錯) js文件中實現(xiàn)該功能,發(fā)起ajax請求到后端視圖中對數(shù)據(jù)庫進(jìn)行操作 路由導(dǎo)入 在視圖里面實現(xiàn)刪除功能

    2024年02月13日
    瀏覽(93)
  • Django后端開發(fā)——mysql數(shù)據(jù)庫連接遇到的問題及解決

    stackflow帖子:https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost 報錯: 數(shù)據(jù)庫拒絕root用戶的連接 settings.py中關(guān)于數(shù)據(jù)庫的配置: 可以看到root用戶的密碼為123456 但是在mysql數(shù)據(jù)庫里面查看用戶信息,root的密碼為空 這樣的不匹配導(dǎo)致連接失敗 之前嘗試

    2024年02月20日
    瀏覽(96)
  • django使用mysql數(shù)據(jù)庫

    django使用mysql數(shù)據(jù)庫

    Django開 發(fā)操作數(shù)據(jù)庫比使用pymysql操作更簡單,內(nèi)部提供了ORM框架。 下面是pymysql 和orm操作數(shù)據(jù)庫的示意圖,pymysql就是mysql的驅(qū)動,代碼直接操作pymysql ,需要自己寫增刪改查的語句 django 就是也可以使用pymysql、mysqlclient作為驅(qū)動,但是目前對mysqlclient的支持更好,在驅(qū)動的基礎(chǔ)

    2024年02月14日
    瀏覽(20)
  • Django中級指南:理解并實現(xiàn)Django的模型和數(shù)據(jù)庫遷移

    Django 是一個極其強(qiáng)大的 Python Web 框架,它提供了許多工具和特性,能夠幫助我們更快速、更便捷地構(gòu)建 Web 應(yīng)用。在本文中,我們將會關(guān)注 Django 中的模型(Models)和數(shù)據(jù)庫遷移(Database Migrations)這兩個核心概念。 在 Django 中,模型是一種特殊的對象,它對應(yīng)數(shù)據(jù)庫中的一張

    2024年02月13日
    瀏覽(21)
  • 二擋起步——pythonweb開發(fā)Django框架,前端原生+Django后端框架+python網(wǎng)絡(luò)抓包(代替數(shù)據(jù)庫數(shù)據(jù))(附帶小案例)

    二擋起步——pythonweb開發(fā)Django框架,前端原生+Django后端框架+python網(wǎng)絡(luò)抓包(代替數(shù)據(jù)庫數(shù)據(jù))(附帶小案例)

    ?大家好,我是csdn的博主: lqj_本人 這是我的個人博客主頁: lqj_本人的博客_CSDN博客-微信小程序,前端,python領(lǐng)域博主 lqj_本人擅長微信小程序,前端,python,等方面的知識 https://blog.csdn.net/lbcyllqj?spm=1011.2415.3001.5343 嗶哩嗶哩歡迎關(guān)注: 小淼Develop 小淼Develop的個人空間-小淼Develop個

    2024年02月03日
    瀏覽(109)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包