新聞中心
在當今互聯(lián)網(wǎng)時代,數(shù)據(jù)庫已經(jīng)逐漸成為了企業(yè)和組織進行信息管理的不可或缺的工具。但是,在企業(yè)和組織規(guī)模逐漸擴大的情況下,數(shù)據(jù)量也越來越龐大,單個數(shù)據(jù)庫已經(jīng)無法滿足需求。因此,多個數(shù)據(jù)庫的使用已經(jīng)成為了常態(tài)。但是,在使用多個數(shù)據(jù)庫的過程中,如何正確地進行匹配,才能夠更好地實現(xiàn)數(shù)據(jù)的管理與利用,則成了一個十分重要的問題。

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設、做網(wǎng)站、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務大新,十多年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108
要考慮多個數(shù)據(jù)庫的類型以及功能。在實踐中,使用的數(shù)據(jù)庫可以分為結構化數(shù)據(jù)庫、非結構化數(shù)據(jù)庫以及用于搜索的數(shù)據(jù)庫等多種類型。因此,在使用多個數(shù)據(jù)庫的時候,必須要根據(jù)需要進行選擇和精細的匹配。更好的辦法是根據(jù)數(shù)據(jù)類型和數(shù)據(jù)量,選擇適合的數(shù)據(jù)庫進行使用,以達到數(shù)據(jù)存儲和訪問的更佳效果。
為了更好地對多個數(shù)據(jù)庫進行管理,必須要對數(shù)據(jù)庫進行分類和歸類。對于相似或相關的數(shù)據(jù)庫,應當將其歸為同一類別,方便統(tǒng)一管理。另外,由于不同的數(shù)據(jù)庫具有不同的性質和特點,因此在管理和操作時,需要根據(jù)實際需求,精細地設置權限和操作規(guī)則,以避免不必要的錯誤和數(shù)據(jù)泄露等情況。
再次,為了實現(xiàn)多個數(shù)據(jù)庫的協(xié)同工作,需要利用好跨數(shù)據(jù)庫的工具和技術。一些成熟的數(shù)據(jù)庫管理軟件可以通過跨數(shù)據(jù)庫的查詢、聯(lián)合操作、備份和恢復等功能,讓多個數(shù)據(jù)庫可以相互連接和協(xié)同管理,提高企業(yè)和組織的數(shù)據(jù)處理效率。
要做好數(shù)據(jù)庫備份和數(shù)據(jù)同步工作。備份可以很好地保障數(shù)據(jù)庫的安全性和可靠性,而數(shù)據(jù)同步則可以實現(xiàn)對多個數(shù)據(jù)庫的協(xié)同部署以及對數(shù)據(jù)的及時更新和變更。在具體實踐中,可以選擇一些自動備份和數(shù)據(jù)同步工具,如數(shù)據(jù)庫鏡像、數(shù)據(jù)副本等。
正確匹配多個數(shù)據(jù)庫是非常重要的。在企業(yè)和組織規(guī)模逐漸擴大的情況下,正確的數(shù)據(jù)庫匹配不僅可以提高數(shù)據(jù)處理的效率和質量,同時也可以保證數(shù)據(jù)的安全性和可靠性,為企業(yè)和組織的發(fā)展提供更可靠、高效的數(shù)據(jù)支持。
相關問題拓展閱讀:
- 如何在django中使用多個數(shù)據(jù)庫
如何在django中使用多個數(shù)據(jù)庫
使用多個數(shù)據(jù)庫
New in Django 1.2: Please, see the release notes
大多數(shù)其他文檔都假設使用單一數(shù)據(jù)庫,本文主要討論如何在 Django 中使用多個數(shù)據(jù)庫。 使用多個數(shù)據(jù)庫,要增加一些步驟。
定義你的數(shù)據(jù)庫
使用多數(shù)據(jù)庫的之一步是通過 DATABASES 設置要使用的數(shù)據(jù)庫服務。這個 設置用于映射數(shù)據(jù)庫別名和特定的聯(lián)結設置字典,這是 Django 定義數(shù)據(jù)庫一貫的手法。 字典內(nèi)部的設置參見 DATABASES 文檔。
數(shù)據(jù)庫可以使用任何別名,但是 default 有特殊意義。當沒有選擇其他數(shù)據(jù)庫時, Django 總是使用別名為 default 的數(shù)據(jù)庫。因此,如果你沒有定義一個名為 default 的數(shù)據(jù)庫時,你應當小心了,在使用數(shù)據(jù)庫前要指定你想用的數(shù)據(jù)庫。
以下是一個定義兩個數(shù)據(jù)庫的 settings.py 代碼片斷。定義了一個缺省的 PostgreSQL 數(shù)據(jù)庫和一個名為 users 的 MySQL 數(shù)據(jù)庫:
DATABASES = { ‘default’: { ‘NAME’: ‘a(chǎn)pp_data’, ‘ENGINE’: ‘django.db.backends.postgresql_psycopg2’, ‘USER’: ‘postgres_user’, ‘PASSWORD’: ‘s3krit’ }, ‘users’: { ‘NAME’: ‘user_data’, ‘ENGINE’: ‘django.db.backends.mysql’, ‘USER’: ‘mysql_user’, ‘PASSWORD’: ‘priv4te’ } }
如果你嘗試訪問 DATABASES 設置中沒有定義的數(shù)據(jù)庫, Django 會拋出一個 django.db.utils.ConnectionDoesNotExist異常。
同步你的數(shù)據(jù)庫
syncdb 管理命令一次只操作一個數(shù)據(jù)庫。缺省情況下,它操作 default 數(shù)據(jù)庫。但是加上 –database 參數(shù),你可以讓 syncdb 同步不同的 數(shù)據(jù)庫。所頌空以要同步我們例子中的所有數(shù)據(jù)庫的所有模型可以使用如下命令:
$ ./manage.py syncdb
$ ./manage.py syncdb –database=users
如果你不是同步所有的程序到同一個數(shù)據(jù)庫中,你可定義一個 數(shù)據(jù)庫路由 來為指定的模型實施特定的控制 策略。
如果你要精細地控制同步,那么還有一種方式是修改 sqlall 的輸出,手工在 數(shù)據(jù)庫中執(zhí)行命令,命令如下:
$ ./manage.py sqlall sales | ./manage.py dbshell
使用其他管理命令
其他操作數(shù)據(jù)庫的 django-admin.py 命令與 syncdb 類似,他們一次只 操作一個數(shù)據(jù)庫,使用 –database 來控制使用哪個數(shù)據(jù)庫。
自動數(shù)據(jù)庫路由
使用多數(shù)據(jù)庫最簡單的方法是設置一個數(shù)據(jù)啟鄭庫路由方案。缺省的路由方案確保對象 “緊貼”其原本的數(shù)據(jù)庫(例如:一個對象從哪個數(shù)據(jù)庫取得,就保存回哪個數(shù)據(jù)庫)。 缺省的路由方案還確保如果一個數(shù)據(jù)庫沒有指定,所有的查詢都會作用于 缺省 數(shù)據(jù) 庫。
你不必為啟動缺省路由方案作任何事,因為它是“開箱即用”的。但是,如果你要執(zhí)行 一些更有趣的數(shù)據(jù)庫分配行為的話,你可以定義并安裝你自己的數(shù)據(jù)庫路由。
數(shù)據(jù)庫路由
一個數(shù)據(jù)庫路由是一個類,這個類最多有四個方法:
db_for_read(model, **hints)
建議 model 對象寫操作時使用的數(shù)據(jù)庫。
如果一個數(shù)據(jù)庫操作可以提供對選擇數(shù)據(jù)庫有用的附加信息,那么可以通過 hints 字典提供。詳見 下文 。
如果沒有建議則返回 None 。
db_for_write(model, **hints)
建議 model 對象讀操作時使用的數(shù)據(jù)庫。
如果一悄櫻頌個數(shù)據(jù)庫操作可以提供對選擇數(shù)據(jù)庫有用的附加信息,那么可以通過 hints 字典提供。詳見 下文 。
如果沒有建議則返回 None 。
allow_relation(obj1, obj2, **hints)
當 obj1 和 obj2 之間允許有關系時返回 True ,不允許時返回 False ,或者沒有 意見時返回 None 。這是一個純粹的驗證操作,用于外鍵和多對多操作中,兩個對象 的關系是否被允許。
allow_syncdb(db, model)
決定 model 是否可以和 db 為別名的數(shù)據(jù)庫同步。如果可以返回 True , 如果不可以返回 False ,或者沒有意見時返回 None 。這個方法用于決定一個給定 數(shù)據(jù)庫的模型是否可用。
一個路由不必提供 所有 這些方法,可以省略其中一個或多個。如果其中一個方法被 省略了,那么 Django 會在執(zhí)行相關檢查時跳過相應路由。
提示參數(shù)
數(shù)據(jù)庫路由接收的“提示”參數(shù)可用于決定哪個數(shù)據(jù)庫應當接收一個給定的請求。
目前,唯一可以提供的提示參數(shù)是 實例 ,即一個與讀寫操作相關的對象的實例。 可以是一個已保存的對象的實例,也可以是一個多對多關系中添加的實例。在某些情況下, 也可能沒有對象的實例可以提供。路由會檢查提示實例是否存在,并相應地決定是否改變 路由行為。
使用路由
數(shù)據(jù)庫路由使用 DATABASE_ROUTERS 設置來安裝。這個設置定義一個類名稱 列表,每個類定義一個用于主路由 (django.db.router) 的路由。
主路由用于 Django 分配數(shù)據(jù)庫操作。當一個查詢想要知道使用哪個數(shù)據(jù)庫時,會提供 一個模型和一個提示(如果有的話),并調(diào)用主路由。
Django 就會按次序嘗試每個路由,
直到找到合適的路由建議。如果找不到路由建議就會嘗試實例提示的當前的 _state.db 。如果沒有提供路由提示,或者實例沒有當前數(shù)據(jù)庫狀態(tài),那么
主路由會 分配 缺省 數(shù)據(jù)庫。
一個例子
僅用于示例目的!
這個例子僅用于展示路由如何改變數(shù)據(jù)庫的使用。本例有意忽略了一些復雜的東西以 便于更好的展示路由是如何工作的。
如果任何一個 myapp 中的模型包含與 另一個 數(shù)據(jù)庫中模型的關系時,本例 是無效的。參見 跨數(shù)據(jù)庫關系一節(jié)中介紹 的 Django 引用完整性問題。
本例的主/從配置也是有缺陷的:它沒有處理復制延時(比如因為把寫操作傳遞給從 數(shù)據(jù)庫耗費時間而產(chǎn)生的查詢不一致),也沒有考慮與數(shù)據(jù)庫使用策略的交互作用。
那么,這個例子有什么用呢?本例僅用于演示一個 myapp 存在于 other 數(shù)據(jù)庫, 所有其他模型之間是主/從關系,且存在于 master 、 slave1 和 slave2 數(shù)據(jù)庫。本例使用了兩個路由:
class MyAppRouter(object): “”” 一個控制 myapp 應用中模型的 所有數(shù)據(jù)庫操作的路由 “”” def db_for_read(self, model, **hints): “myapp 應用中模型的操作指向 ‘other'” if model._meta.app_label == ‘myapp’: return ‘other’ return None def db_for_write(self, model, **hints): “myapp 應用中模型的操作指向 ‘other'” if model._meta.app_label == ‘myapp’: return ‘other’ return None def allow_relation(self, obj1, obj2, **hints): ” 如果包含 myapp 應用中的模型則允許所有關系 ” if obj1._meta.app_label == ‘myapp’ or obj2._meta.app_label == ‘myapp’: return True return None def allow_syncdb(self, db, model): ” 確保 myapp 應用只存在于 ‘other’ 數(shù)據(jù)庫 ” if db == ‘other’: return model._meta.app_label == ‘myapp’ elif model._meta.app_label == ‘myapp’: return False return None class MasterSlaveRouter(object): “”” 一個設置簡單主/從定義 的路由 “”” def db_for_read(self, model, **hints): ” 所有讀操作指向一個隨機的從數(shù)據(jù)庫 ” return random.choice() def db_for_write(self, model, **hints): ” 所有寫操作指向主數(shù)據(jù)庫 ” return ‘master’ def allow_relation(self, obj1, obj2, **hints): ” 允許數(shù)據(jù)庫池中的兩個對象間的任何關系 ” db_list = (‘master’,’slave1′,’slave2′) if obj1._state.db in db_list and obj2._state.db in db_list: return True return None def allow_syncdb(self, db, model): ” 顯示地放置所有數(shù)據(jù)庫中的模型 ” return True
然后在你的設置文件增加如下內(nèi)容(把 path.to. 替換為你定義路由的模型的路徑 ):
DATABASE_ROUTERS =
這個設置中,路由的順序是很重要的,因為查詢時是按這個設置中的順序依次查詢的。上 例中, MyAppRouter 先于MasterSlaveRouter ,因此, myapp 中的模型就 優(yōu)先于其他模型。如果 DATABASE_ROUTERS 設置中兩個路由的順序變換了, 那么 MasterSlaveRouter.allow_syncdb() 會優(yōu)先執(zhí)行。因為 MasterSlaveRouter 是 包羅萬象的,這樣就會導致所有模型可以使用所有數(shù)據(jù)庫。
設置好之后讓我們來運行一些代碼:
>>> # 從 ‘credentials’ 數(shù)據(jù)庫獲得數(shù)據(jù) >>> fred = User.objects.get(username=’fred’) >>> fred.first_name = ‘Frederick’ >>> # 保存到 ‘credentials’ 數(shù)據(jù)庫 >>> fred.save() >>> # 隨機從從數(shù)據(jù)庫獲得數(shù)據(jù) >>> dna = Person.objects.get(name=’Douglas Adams’) >>> # 新對象創(chuàng)建時還沒有分配數(shù)據(jù)庫 >>> mh = Book(title=’Mostly Harmless’) >>> # 這個賦值會向路由發(fā)出請求,并把 mh 的數(shù)據(jù)庫設置為與 author 對象同樣的 >>> # 數(shù)據(jù)庫 >>> mh.author = dna >>> # 這會強制 ‘mh’ 實例使用主數(shù)據(jù)庫… >>> mh.save() >>> # … 但如果我們重新獲取對象,就會從從數(shù)據(jù)庫中獲取 >>> mh = Book.objects.get(title=’Mostly Harmless’)
手動選擇數(shù)據(jù)庫
Django 也提供一個可以讓你通過代碼完全控制數(shù)據(jù)庫使用的 API 。手動定義數(shù)據(jù)庫分配 優(yōu)先于路由。
為一個 查詢集 手動選擇一個數(shù)據(jù)庫
你可以在 查詢集 “鏈”中的任何點為 查詢集 選擇數(shù)據(jù)庫。我們通過在 查詢集 上調(diào)用 using() 來得到使用指定數(shù)據(jù)庫的另一個 查詢集 。
using() 使用一個參數(shù):你想要運行查詢的數(shù)據(jù)庫的別名。例如:
>>> # 這會運行在“缺省”數(shù)據(jù)庫上。 >>> Author.objects.all() >>> # 這同樣會運行在“缺省”數(shù)據(jù)庫上。 >>> Author.objects.using(‘default’).all() >>> # 這會運行在“ other ”數(shù)據(jù)庫上。 >>> Author.objects.using(‘other’).all()
為 save() 選擇一個數(shù)據(jù)庫
在使用 Model.save() 時加上 using 關鍵字可以指定保存到哪個數(shù)據(jù)庫。
例如,要把一個對象保存到 legacy_users 數(shù)據(jù)庫應該這樣做:
>>> my_object.save(using=’legacy_users’)
如果你不定義 using ,那么 save() 方法會根據(jù)路由分配把數(shù)據(jù)保存到缺省 數(shù)據(jù)庫中。
把一個對象從一個數(shù)據(jù)庫移動到另一個數(shù)據(jù)庫
當你已經(jīng)在一個數(shù)據(jù)庫中保存了一個對象后,你可能會使用 save(using=…) 把這個 對象移動到另一個數(shù)據(jù)庫中。但是,如果你沒有使用恰當?shù)姆椒?,那么可能會出現(xiàn)意想不 到的后果。
假設有如下的例子:
>>> p = Person(name=’Fred’) >>> p.save(using=’first’) # (之一句) >>> p.save(using=’second’) # (第二名)
在之一名中,一個新的 Person 對象被保存到 first 數(shù)據(jù)庫中。這時, p 還沒有一個主鍵,因此 Django 執(zhí)行了一個INSERT SQL 語句。這樣就會創(chuàng)建一個 主鍵,并將這個主鍵分配給 p 。
在第二句中,因為 p 已經(jīng)有了一個主鍵,所以 Django 在保存對象時會嘗試在新的 數(shù)據(jù)庫中使用這個主鍵。如果 second數(shù)據(jù)庫中沒有使用這個主鍵,那就不會有問題, 該對象會復制到新數(shù)據(jù)庫。
然而,如果 p 的主鍵在 second 數(shù)據(jù)庫中已經(jīng)使用過了,那么 second 使用 這個主鍵的已存在的對象將會被 p 覆蓋。
有兩種方法可以避免上述情況的發(fā)生。之一,你可以清除實例的主鍵。如果一個對象沒有 主主鍵,那么 Django 會把它看作一個新對象,在保存到 second 數(shù)據(jù)庫中時就不會 帶來數(shù)據(jù)的損失:
>>> p = Person(name=’Fred’) >>> p.save(using=’first’) >>> p.pk = None # 清除主鍵。 >>> p.save(using=’second’) # 寫入一個全新的對象。
第二種方法是在 save() 方法中使用 force_insert 選項來保證 Django 執(zhí)行 一個 INSERT SQL:
>>> p = Person(name=’Fred’) >>> p.save(using=’first’) >>> p.save(using=’second’, force_insert=True)
這樣可以保證名為 Fred 的人員在兩個數(shù)據(jù)庫中使用相同的主鍵。如果在保存到 second 數(shù)據(jù)庫時主鍵已被占用,會拋出一個錯誤。
選擇一個要刪除數(shù)據(jù)的數(shù)據(jù)庫
缺省情況下,一個現(xiàn)存對象從哪個數(shù)據(jù)庫得到,刪除這個對象也會在這個數(shù)據(jù)庫中進行:
>>> u = User.objects.using(‘legacy_users’).get(username=’fred’) >>> u.delete() # 會從 `legacy_users` 數(shù)據(jù)庫中刪除
通過向 Model.delete() 方法傳遞 using 關鍵字參數(shù)可以定義在哪個數(shù)據(jù)庫中刪除 數(shù)據(jù)。 using 的用法與 save() 方法中使用這個參數(shù)類似。
例如,假設我們要把一個用戶從 legacy_users 數(shù)據(jù)庫移動到 new_users 數(shù)據(jù)庫 可以使用如下命令:
>>> user_obj.save(using=’new_users’) >>> user_obj.delete(using=’legacy_users’)
多數(shù)據(jù)庫情況下使用管理器
在管理器上使用 db_manager() ,可以讓管理器訪問一個非缺省數(shù)據(jù)庫。
例如,假設你有一個操作數(shù)據(jù)庫的自定義管理器 User.objects.create_user() 。
因為 create_user() 是一個管理器方法,不是一個 查詢集 ,所以你不能
用 User.objects.using(‘new_users’).create_user() 。( create_user() 方法
只能用于 User.objects 管理器,而不能用于,管理器衍生出的 查詢集 。) 解決方法是使用 db_manager() ,就象下面這樣:
User.objects.db_manager(‘new_users’).create_user(…)
db_manager() 返回的是綁定到你指定的數(shù)據(jù)庫的管理器的一個副本。
多數(shù)據(jù)庫情況下使用 get_query_set()
如果你在管理器中重載了 get_query_set() ,請確保在其父類中也調(diào)用了相同的方法 (使用 super() )或者正確處理管理器中的 _db 屬性(一個包含要使用的數(shù)據(jù)庫 名稱的字符串)。
例如,如果你要從 get_query_set 方法返回一個自定義 查詢集 類,那么你可以 這樣做:
class MyManager(models.Manager): def get_query_set(self): qs = CustomQuerySet(self.model) if self._db is not None: qs = qs.using(self._db) return qs
在 Django 管理接口中使用多數(shù)據(jù)庫
Django 的管理接口沒有明顯支持多數(shù)據(jù)庫。如果想要支持的話你必須寫自定義 ModelAdmin 。
如果要支持多數(shù)據(jù)庫,那么 ModelAdmin 對象有五個方法要自定義:
關于怎么匹配出多個數(shù)據(jù)庫的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
成都網(wǎng)站推廣找創(chuàng)新互聯(lián),老牌網(wǎng)站營銷公司
成都網(wǎng)站建設公司創(chuàng)新互聯(lián)(www.cdcxhl.com)專注高端網(wǎng)站建設,網(wǎng)頁設計制作,網(wǎng)站維護,網(wǎng)絡營銷,SEO優(yōu)化推廣,快速提升企業(yè)網(wǎng)站排名等一站式服務。IDC基礎服務:云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗、服務器租用、服務器托管提供四川、成都、綿陽、雅安、重慶、貴州、昆明、鄭州、湖北十堰機房互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務。
分享文章:如何正確匹配多個數(shù)據(jù)庫? (怎么匹配出多個數(shù)據(jù)庫)
文章地址:http://m.fisionsoft.com.cn/article/cojiodc.html


咨詢
建站咨詢
