Django4.0 進(jìn)階測(cè)試主題-測(cè)試與多數(shù)據(jù)庫(kù)

2022-03-17 11:56 更新

測(cè)試主/副配置

如果你使用主/副本(某些數(shù)據(jù)庫(kù)稱為主/從)復(fù)制來(lái)測(cè)試多數(shù)據(jù)庫(kù)配置,那么這種創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)的策略會(huì)帶來(lái)問(wèn)題。當(dāng)創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)時(shí),不會(huì)有任何復(fù)制,因此,在主服務(wù)器上創(chuàng)建的數(shù)據(jù)在副本上看不到。
為了彌補(bǔ)這一點(diǎn),Django 允許你定義一個(gè)數(shù)據(jù)庫(kù)是 測(cè)試鏡像??紤]以下(簡(jiǎn)化的)數(shù)據(jù)庫(kù)配置示例:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'HOST': 'dbprimary',
         # ... plus some other settings
    },
    'replica': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'HOST': 'dbreplica',
        'TEST': {
            'MIRROR': 'default',
        },
        # ... plus some other settings
    }
}

在這個(gè)設(shè)置中,我們有兩個(gè)數(shù)據(jù)庫(kù)服務(wù)器。?dbprimary?,用數(shù)據(jù)庫(kù)別名 ?default ?描述,?dbreplica ?用別名 ?replica ?描述。正如你所期望的那樣,?dbreplica ?被數(shù)據(jù)庫(kù)管理員配置為 ?dbprimary ?的讀副本,因此在正?;顒?dòng)中,對(duì) ?default ?的任何寫入都會(huì)出現(xiàn)在 ?replica ?上。
如果 Django 創(chuàng)建了兩個(gè)獨(dú)立的測(cè)試數(shù)據(jù)庫(kù),就會(huì)破壞任何期望復(fù)制發(fā)生的測(cè)試。然而,?replica ?數(shù)據(jù)庫(kù)已經(jīng)被配置為測(cè)試鏡像(使用 ?MIRROR ?測(cè)試設(shè)置),表明在測(cè)試中,?replica? 應(yīng)該被當(dāng)作 ?default ?的鏡像。
在配置測(cè)試環(huán)境時(shí),?replica ?的測(cè)試版本將不會(huì)被創(chuàng)建。相反,與?replica?的連接將被重定向?yàn)橹赶??default?。因此,對(duì) ?default ?的寫入將出現(xiàn)在 ?replica ?上——但這是因?yàn)樗鼈儗?shí)際上是同一個(gè)數(shù)據(jù)庫(kù),而不是因?yàn)閮蓚€(gè)數(shù)據(jù)庫(kù)之間有數(shù)據(jù)復(fù)制。

控制測(cè)試數(shù)據(jù)庫(kù)的創(chuàng)建順序

默認(rèn)情況下,Django 會(huì)假設(shè)所有的數(shù)據(jù)庫(kù)都依賴于 ?default ?數(shù)據(jù)庫(kù),因此總是先創(chuàng)建 ?default ?數(shù)據(jù)庫(kù)。但是,我們不保證測(cè)試配置中其他數(shù)據(jù)庫(kù)的創(chuàng)建順序。
如果你的數(shù)據(jù)庫(kù)配置需要特定的創(chuàng)建順序,你可以使用 ?DEPENDENCIES ?測(cè)試設(shè)置指定存在的依賴關(guān)系??紤]以下(簡(jiǎn)化的)數(shù)據(jù)庫(kù)配置示例:

DATABASES = {
    'default': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds'],
        },
    },
    'diamonds': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': [],
        },
    },
    'clubs': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds'],
        },
    },
    'spades': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds', 'hearts'],
        },
    },
    'hearts': {
        # ... db settings
        'TEST': {
            'DEPENDENCIES': ['diamonds', 'clubs'],
        },
    }
}

在這種配置下,將首先創(chuàng)建 ?diamonds ?數(shù)據(jù)庫(kù),因?yàn)樗俏ㄒ粵](méi)有依賴性的數(shù)據(jù)庫(kù)。接下來(lái)將創(chuàng)建 ?default ?和 ?clubs ?數(shù)據(jù)庫(kù)(盡管這兩個(gè)數(shù)據(jù)庫(kù)的創(chuàng)建順序沒(méi)有保證),然后是 ?hearts?,最后是 ?spades?。
如果在 ?DEPENDENCIES ?定義中存在任何循環(huán)依賴關(guān)系,將引發(fā) ?ImproperlyConfigured ?異常。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)