如何使两个django项目共享同一个数据库

时间:2016-09-29 15:37:52

标签: python django

我需要让两个单独的Django项目共享同一个数据库。在project_1我有模型创建我需要在project_2中使用的对象(主要是图像)。

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.db保留在 project_1 / path ,从而将 project_2 / settings.py DATABASES设置为指向< EM> PROJECT_1 / development.db

2 个答案:

答案 0 :(得分:6)

您可以在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'
        ),
    },
}

这会给你要求的结构。但请注意,这些项目不是“独立”和“#34;”。 project_2显然取决于project_1的数据库。

在任何情况下,也许您还应该查看os.path模块以获取更多信息。

答案 1 :(得分:1)

您只需要在类meta中的模型中声明属性db_table,其名称与app +模型的名称(Django自动生成的名称)不同,两次项目都需要相同的模型。在进行makemigrations和迁移之前。

class MyModel(models.Model):
    class Meta:
        db_table = 'MyModel'