2011-04-13 34 views
0

我有一個項目(#1)與其中的幾個應用程序在它使用MySQL數據庫#1。我還有另一個項目(#2),它的django代碼在同一臺服務器上,但它使用了不同的mysql數據庫(#2)。在django中,如何從主項目中查詢單獨的項目?

我的目標是運行在項目#1中的Web應用程序,並使用Django模型從項目#2對DB#2的簡單查詢。然而,當我從項目#2導入時,它仍然使用#1數據庫,即使#2的settings.py文件適當地使用了數據庫#2(即當我在項目#2中運行web應用程序時,它工作正常)。

這裏是我可以成功運行作爲一個獨立的腳本文件的全部。可悲的是,當我將文件導入項目#1和運行功能,它失敗(因爲它正在尋找在DB#1表):

import sys 

def get_stuff_from_project2(ids): 
    from django.core.management import setup_environ 
    from project2 import settings 
    setup_environ(settings) 

    from project2.myapp2.models import mymodel2 

    all_rows = mymodel2.objects.filter(id__in=ids).values() 
    return(all_rows) 

# as a standalone script, run the main function 
if __name__ == "__main__": 
    sys.path.append("/home/me/django") 
    print str (get_stuff_from_project2(sys.argv[1:])) 

再次,這可以作爲一個獨立的腳本。但是,從項目#1(使用下面的代碼)失敗了DatabaseError,表「db1.myapp2_mymodel2」不存在:

from project1.myapp1.standalone_script import get_stuff_from_project2 
all_rows = get_stuff_from_project2(ids) 

在這裏,我的猜測是,setup_environ功能實際上並不處理新DATABASE_NAME ,或者在設置設置後它不能更改現有的DATABASE_NAME?

我在這一點上有點失落,並一直在試圖尋找一個解決方案。我並不想真正採用「多站點」或「多數據庫」的方法,因爲我真的希望將項目1和項目2儘可能分開。我的選擇是將獨立腳本作爲系統調用從項目1中調用,或者在項目2中創建一個視圖,該視圖是API併發送數據。但是,我認爲只要使用模型將是最簡單的。

謝謝。

-------添加4月13日11:35 PST ----

這裏的問題的一個簡單的版本:我如何可以訪問兩個不同的項目從單一的獨立腳本。下面的代碼工作確定爲哪個項目我setup_environ在第一,但它不能做第二個:

import sys 
from django.core.management import setup_environ 
sys.path.append('/home/me/django') 

from project1 import settings 
print setup_environ(settings) # shows /home/me/django/project1 
print settings.DATABASE_NAME # shows db1 
from project1.myapp1.models import mymodel1 
mymodel1.objects.filter(id=9376544).values() # works fine 

from project2 import settings 
print setup_environ(settings) # shows /home/me/django/project2 
print settings.DATABASE_NAME # shows db2 
from project2.myapp2.models import mymodel2 
mymodel2.objects.filter(id=6544).values() # fails with: 
# django.db.utils.DatabaseError: (1146, "Table 'db1.myapp2_mymodel2' doesn't exist") 

回答

0

我無法使用單個腳本解決此問題。我使用了兩個腳本:第一個將第二個腳本命名爲shell命令,第二個輸出將數據格式化爲stdout列表。

這一直是閱讀從另一個應用程序的數據庫中的數據的單個流問題足夠強大,但不適合於一個更大的問題,如需要幾個查詢或書面形式向第二應用程序的數據。對於更復雜的問題,添加API(XMLRPC,REST在Django中很容易)可以調用正在運行的應用程序。

0

你要其他項目添加到您的PYTHONPATH(在你的WSGI文件,例如,如果您使用的是mod_wsgi,或者如果您想在「python manage.py shell」中訪問該項目,則在項目manage.py文件中)。如果你已經這樣做了,它就像一個魔法。

+0

但是,這兩個項目#1和#項目2已經在同一個Python路徑中(我編輯我上面的代碼和移動sys.path.append聲明下來的主要條件,而不是使之更加清楚)。我的目錄結構如下所示:/ home/me/django/project1和/ home/me/django/project2和/ home/me/django已經在我的Python路徑中。 – brfox 2011-04-13 05:33:17