2008-11-06 110 views
9

從一些論壇我知道多個數據庫支持在Django的較低級別添加,但更高級別的apis尚未添加。django中的多個數據庫支持

任何人都可以請告訴我如何可以在Django中實現多個數據庫連接。

有沒有人知道什麼時候Django會完全/正式支持多個數據庫連接。

回答

0

我認爲你將不得不求助於「原始SQL」 ..有點事..
看這裏:http://docs.djangoproject.com/en/dev/topics/db/sql/

你需要一個「連接」到其他數據庫, 如果你看看周圍django/db/__init__.py第39行(在我的版本。)

connection = backend.DatabaseWrapper(**settings.DATABASE_OPTIONS)

嘗試從那裏..
PS我沒有真正嘗試過這個或其他什麼,只是試圖指出我認爲可能解決您的問題的一般方向。

3

如果你讀了幾許多(許多)關於這個問題在Django-dev的線程,你會看到什麼看起來簡單,是不是。如果你選擇一個用例,那麼它看起來很簡單,但是一旦你開始總結任何方式,你就會遇到麻煩。

要使用上述引用的線程作爲示例,當您說「多個數據庫」時,您在談論以下哪一項?

  • 所有數據庫在同一臺機器下在同一個引擎下。 (例如MySQL + PostgreSQL)
  • 在不同機器上具有N個只讀從站的一個主DB。
  • 跨多個數據庫服務器的表分片。

,你將需要:

整個數據塊
  • 外鍵
  • JOIN的跨機器和/或發動機
  • 等等,等等

一個問題用一個漂亮的ORM就像Django一樣,它在一個不錯的繪畫工作下隱藏了所有這些混亂的細節。要繼續做到這一點,但要添加上述任何一項,並不容易(tm)。

+0

我不明白,這確實是一個複雜的工作。 但是,然後django可能只能用於簡單的Web應用程序,一旦應用程序變大,它就成爲分割數據在多個數據庫服務器(分片)中的強制性。開發者如何處理這種情況? – codebreak 2008-11-08 05:31:14

+0

在所有多個數據庫問題中,分片可能是特定應用程序中最具特色的,因此最難以產生一個通用解決方案。你知道任何有這個問題的通用解決方案的ORM嗎? – 2008-11-08 20:39:44

2

Eric Florenzano寫了一篇非常好的博客文章,允許您在多個數據庫支持:Easy MultipleDatabase Support for Django

它首先創建一個新的自定義管理器,允許您指定數據庫設置。

+0

根據Eric的示例修改全局設置對象並不是一個線程安全的事情。它看起來可能是下層連接API已經改變,以允許傳入設置,這將使它線程安全。 – 2009-08-27 20:16:50

0

如果所有的數據庫使用相同的引擎,Eric Florenzano的方法運行良好。如果你有不同的引擎(在我的情況下是Postgres和MSSQL),你會在ORM代碼中遇到很多問題(例如使用默認連接的SQL語法的models/sql/where.py)。

如果您需要這個工作,你應該等待其計劃在Django 1.2

9

如果你只是需要多連接亞歷克斯Gaynor的MultiDB項目,你可以做這樣的事情:

from django.db import load_backend 
myBackend = load_backend('postgresql_psycopg2') # or 'mysql', 'sqlite3', 'oracle' 
myConnection = myBackend.DatabaseWrapper({ 
    'DATABASE_HOST': '192.168.1.1', 
    'DATABASE_NAME': 'my_database', 
    'DATABASE_OPTIONS': {}, 
    'DATABASE_PASSWORD': "", 
    'DATABASE_PORT': "", 
    'DATABASE_USER': "my_user", 
    'TIME_ZONE': "America/New_York",}) 
# Now we can do all the standard raw sql stuff with myConnection. 
myCursor = myConnection.cursor() 
myCursor.execute("SELECT COUNT(1) FROM my_table;") 
myCursor.fetchone() 
1

多個數據庫從

我們總是需要一個選擇名爲默認,其餘的名稱取決於你。

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'mupltiple_datab_app1',      
     'USER': 'root',      
     'PASSWORD': 'admin',     
     'HOST': "",      
     'PORT': "",      
    }, 
    'user1':{ 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'mupltiple_datab_app2',      
     'USER': 'root',      
     'PASSWORD': 'admin',     
     'HOST': "",       
     'PORT': "", 

    }, 
    'user2':{ 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'mupltiple_datab_app3',      
     'USER': 'root',      
     'PASSWORD': 'admin',     
     'HOST':"" ,      
     'PORT': "" , 

    } 
} 

爲同步到一個特定的數據庫

manage.py syncdb --database=user1