Django項(xiàng)目連接多個(gè)數(shù)據(jù)庫配置

Django作為Python最流行的web開發(fā)框架之一卦尊,可以方便地進(jìn)行app分離堡掏,受到廣大pythoner的喜愛呻纹。當(dāng)我們一個(gè)Django項(xiàng)目多個(gè)app需要連接不同數(shù)據(jù)庫時(shí)宋梧,我們該怎么配置呢匣沼?本文將以Python3+Django1.11為例,為大家詳細(xì)講解Django項(xiàng)目連接多個(gè)MySQL數(shù)據(jù)庫的配置步驟捂龄,其他數(shù)據(jù)庫也類似释涛。



1、設(shè)置數(shù)據(jù)庫連接
Python3中PyMySQL代替了MySQLdb模塊倦沧,這里需要做一個(gè)簡單的配置唇撬。
(1)用pip3安裝PyMySQL模塊

 pip3 install PyMySQL

(2)在項(xiàng)目同名目錄myproject/myproject下的__init__.py添加以下代碼

import pymysql
pymysql.install_as_MySQLdb()

(3) 修改settings.py中默認(rèn)的數(shù)據(jù)庫 default

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql01', #連接的數(shù)據(jù)庫名
        'HOST': 'localhost',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'mysql2018',
    }
}

至此,默認(rèn)數(shù)據(jù)庫連接配置完成展融。
2窖认、多數(shù)據(jù)庫連接配置
第1步已經(jīng)實(shí)現(xiàn)了一個(gè)數(shù)據(jù)庫的連接,這個(gè)時(shí)候Django項(xiàng)目的app都使用的默認(rèn)數(shù)據(jù)庫mysql01告希,但是很多情況我們不同的app需要用不同的數(shù)據(jù)庫扑浸。
我們需要在setting.py中進(jìn)行配置。

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql01', #連接的數(shù)據(jù)庫名
        'HOST': 'localhost',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'mysql2018',
    }燕偶,
    'mysql02': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql02', #連接的數(shù)據(jù)庫名
        'HOST': 'localhost',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'mysql2018',
    }
}

DATABASE_ROUTERS = ['myproject.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
    'app01': 'default',
    'app02': 'mysql02',
}

這里配置了一個(gè)數(shù)據(jù)庫路由myproject.database_router.DatabaseAppsRouter喝噪,然后對指定app指定了數(shù)據(jù)庫,'app01': 'default', 'app02': 'mysql02',杭跪。下面我們需要在唉項(xiàng)目同名目錄myproject/myproject下新建一個(gè)database_router.py來實(shí)現(xiàn)數(shù)據(jù)庫路由。

# database_router.py
from django.conf import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING


class DatabaseAppsRouter(object):
    """
    A router to control all database operations on models for different
    databases.

    In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
    will fallback to the `default` database.

    Settings example:

    DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
    """

    def db_for_read(self, model, **hints):
        """"Point all read operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
        """Point all write operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """Allow any relation between apps that use the same database."""
        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_syncdb(self, db, model):
        """Make sure that apps only appear in the related database."""

        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(model._meta.app_label) == db
        elif model._meta.app_label in DATABASE_MAPPING:
            return False
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        """
        Make sure the auth app only appears in the 'auth_db'
        database.
        """
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        return None

    # for Django 1.4 - Django 1.6
    def allow_syncdb(self, db, model):
        """Make sure that apps only appear in the related database."""
 
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(model._meta.app_label) == db
        elif model._meta.app_label in DATABASE_MAPPING:
            return False
        return None
 
    # Django 1.7 - Django 1.11
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        print db, app_label, model_name, hints
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        return None

這樣我們就實(shí)現(xiàn)了不同app使用不同的數(shù)據(jù)庫了驰吓,我們可以使用python manage.py migrate --database=mysql02命令來實(shí)現(xiàn)數(shù)據(jù)庫同步(創(chuàng)建表)涧尿。

如果你喜歡本文章,還請點(diǎn)個(gè)關(guān)注和喜歡檬贰,我會(huì)為大家不斷地帶來Python學(xué)習(xí)筆記姑廉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翁涤,隨后出現(xiàn)的幾起案子桥言,更是在濱河造成了極大的恐慌,老刑警劉巖葵礼,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件号阿,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸳粉,警方通過查閱死者的電腦和手機(jī)扔涧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枯夜,你說我怎么就攤上這事弯汰。” “怎么了湖雹?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵咏闪,是天一觀的道長。 經(jīng)常有香客問我摔吏,道長鸽嫂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任舔腾,我火速辦了婚禮溪胶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘稳诚。我一直安慰自己哗脖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布扳还。 她就那樣靜靜地躺著才避,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氨距。 梳的紋絲不亂的頭發(fā)上桑逝,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音俏让,去河邊找鬼楞遏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛首昔,可吹牛的內(nèi)容都是我干的寡喝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勒奇,長吁一口氣:“原來是場噩夢啊……” “哼预鬓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赊颠,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤格二,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后竣蹦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顶猜,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年痘括,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驶兜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抄淑,靈堂內(nèi)的尸體忽然破棺而出屠凶,到底是詐尸還是另有隱情,我是刑警寧澤肆资,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布矗愧,位于F島的核電站,受9級特大地震影響郑原,放射性物質(zhì)發(fā)生泄漏唉韭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一犯犁、第九天 我趴在偏房一處隱蔽的房頂上張望属愤。 院中可真熱鬧,春花似錦酸役、人聲如沸住诸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贱呐。三九已至,卻和暖如春入桂,著一層夾襖步出監(jiān)牢的瞬間奄薇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工抗愁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馁蒂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓蜘腌,卻偏偏與公主長得像沫屡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子逢捺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,478評論 6 427
  • 版權(quán): https://github.com/haiiiiiyun/awesome-django-cn Aweso...
    若與閱讀 23,080評論 3 241
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    小邁克閱讀 2,984評論 1 3
  • 還有一周便是新的一年了劫瞳,這個(gè)一月過得依舊匆忙,還是去了南方绷柒,吃了很多火鍋志于,很多麻辣的餐食,對于一個(gè)愛吃清淡的人來說...
    田舍娘閱讀 199評論 0 0
  • 今天废睦,日子平平伺绽,沒什么新鮮事兒,現(xiàn)在回頭想想,好像也沒做成什么事奈应,一日就這么過去了澜掩。
    豐色先生閱讀 84評論 0 0