【问题标题】:How to make two django projects share the same database如何让两个django项目共享同一个数据库
【发布时间】:2016-09-29 15:37:51
【问题描述】:

我需要让两个独立的 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/ 路径 中,从而将 project_2/settings.py DATABASES 设置为指向 project_1/ development.db.

【问题讨论】:

  • 这些项目是否有共同的功能或应用?
  • 感谢您的 cmets。这两个项目不共享功能或应用程序,我需要将它们保留为仅共享数据库的独立项目。我在 EDIT 中更好地解释了我的需求。

标签: python django


【解决方案1】:

您可以在 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 模块以获取更多信息。

【讨论】:

  • 谢谢@alxs。我编辑了我的问题以更好地解释我的需求。您能帮我将数据库设置为相同的路径吗?
  • @user123892 我用您要求的额外信息更新了答案
  • 当我尝试使用不同的用户和超级用户权限迁移第二个应用程序时,我收到 django.db.utils.ProgrammingError: permission denied for relationship django_migrations
  • @alxs 如何管理公共数据库的迁移。例如,我在 projects_1 中进行的迁移很少,我是否必须手动复制 projects_2 中的模型更改并运行迁移?有没有更好的办法?
  • @nimeshkiranverma 据我了解,您的每个项目中都有两个不同的应用程序副本。相反,您应该尝试让两个项目都使用一个应用程序,该应用程序“存在”在两个项目都可以访问的公共目录中(如 virtualenv)。就像我在上面的答案中提到的那样,您应该查看有关 reusable apps 的文档。
【解决方案2】:

您只需要在您的模型中的元类中声明属性 db_table,其名称与 app + 模型的名称不同(由 Django 自动生成)两个项目需要相同的模型。在运行 makemigrations 和 migrate 之前。

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

【讨论】:

  • 相关纪念
猜你喜欢
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2012-03-02
  • 2014-07-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多