2016-09-29 183 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的权限被拒绝 –

相关问题