2016-09-29 260 views
0

我需要讓兩個獨立的Django項目共享相同的數據庫。在project_1我有模型創建對象,我需要使用project_2(主要是圖像)。如何讓兩個django項目共享相同的數據庫

project_1_2樹結構是:

project_1/ 
    manage.py 
    settings.py 
    project_1_app1/ 
     ... 
    ... 

project_2/ 
    manage.py 
    settings.py 
    project_2_app1/ 
     ... 
    ... 

這是最好的方法呢?

編輯:我在我的開發環境中使用sqlite3。

我想保留我的兩個django項目作爲獨立項目(以便兩者都可以從各自的存儲庫安全升級)。

# in project_1/settings.py 
import os 

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) 
.. 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(PROJECT_ROOT, 'development.db'), 
    }, 
} 
... 
# in project_2/settings.py 
import os 

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) 
.. 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(PROJECT_ROOT, 'development.db'), 
    }, 
} 
... 

通過這種方式,每個項目都有自己的development.db(一個,我需要共享):

project_1/development.db 
project_2/development.db 

,但我想我需要做更多的東西,使之共享(和獨特)。 對我最好的是保持在development.dbPROJECT_1 /路徑和所設定的project_2/settings.pyDATABASES指向PROJECT_1/development.db

+0

這些項目是否具有通用功能或應用程序? – devxplorer

+1

https://docs.djangoproject.com/en/1.10/topics/db/multi-db/ – madzohan

+1

看看[樣板工程](https://github.com/devxplorer/django-multi-instances)我創建了特殊爲你;)我建議你使用這種方法,因爲你很可能會共享應用程序之間的項目。 – devxplorer

回答

3

您可以簡單地在settings.py中的DATABASES中定義相同的數據庫。所以,如果你的數據庫是PostgreSQL中,你可以做這樣的事情:

# in project_1/settings.py 

DATABASES = { 
    'default': { 
     'NAME': 'common_db', 
     'ENGINE': 'django.db.backends.postgresql', 
     'USER': 'project_1_user', 
     'PASSWORD': 'strong_password_1' 
    }, 
} 

# in project_2/settings.py 

DATABASES = { 
    'default': { 
     'NAME': 'common_db', 
     'ENGINE': 'django.db.backends.postgresql', 
     'USER': 'project_2_user', 
     'PASSWORD': 'strong_password_2' 
    }, 
} 

注意,這兩個數據庫用戶(project_1_userproject_2_user)應該有你要使用的數據庫相應的權限。或者你可以改用兩個項目的同一個用戶。

如果你想每個項目只有一個以上的數據庫,你應該看看docs for multiple databases

關於另一個問題,既然你分享數據,我想你也分享功能。舉例來說,如果project_1_app1project_2_app1做了相同(或相似)的事情,看起來它們可能是單一的reusable app

編輯

由於您使用sqlite3的,你應該確保你使用的是相同的路徑。因此,假設project_1project_2是兄弟,就像這樣:

projects 
    project_1 
    settings.py 
    ... 
    project_2 
    settings.py 
    ... 

你應該試試這個:

# project_1/settings.py 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(PROJECT_ROOT, 'development.db'), 
    }, 
} 


# project_2/settings.py 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(
      os.path.dirname(os.path.dirname(PROJECT_ROOT)), 
      'project_1', 
      'development.db' 
     ), 
    }, 
} 

這將使你問的結構。但請注意,這些項目不是「獨立」的。 project_2顯然依賴於project_1的數據庫。

無論如何,也許你還應該看看os.path模塊瞭解更多信息。

+0

謝謝@alxs。我編輯了我的問題,以更好地解釋我的需求。你能幫我設置數據庫到相同的路徑嗎? – user123892

+0

@ user123892我更新了您請求的額外信息的答案 – alxs

+0

我收到了django.db.utils.ProgrammingError:當我嘗試使用不同的用戶和超級用戶權限遷移第二個應用時,關係django_migrations的權限被拒絕 –

相關問題