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

Python 如何使两个django项目共享同一个数据库,python,django,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/ ... ...

我需要使两个单独的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项目作为独立的项目(这样两个项目都可以从各自的存储库安全地升级)

这样,每个项目都有自己的
development.db
(我需要共享的项目):

但我想我需要做更多的事情来让它共享(和独特)。
对我来说最好的方法是将
development.db
保持在project\u 1/路径上,从而将project\u 2/settings.py
数据库设置为指向project\u 1/development.db。

您可以在settings.py中的
数据库中定义相同的数据库。因此,如果您的数据库是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\u 1\u user
project\u 2\u user
)都应该对要使用的数据库具有相应的权限。或者您可以为两个项目使用相同的用户

如果您希望每个项目都有不止一个数据库,那么应该查看

另一方面,由于您共享数据,我猜您也共享功能。例如,如果
project_1_app1
project_2_app1
做了相同(或类似)的事情,那么它们似乎可以是一个单一的

编辑

由于使用sqlite3,因此应确保使用的路径相同。因此,假设
project_1
project_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'
        ),
    },
}
这将给出您要求的结构。但是请注意,这些项目并非都是“独立的”<代码>项目2
显然依赖于
项目1
的数据库


在任何情况下,也许您也应该查看模块以了解更多信息。

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

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

这些项目是否具有通用功能或应用程序?请看我为您创建的专用程序;)我建议您使用这种方法,因为您很可能会在项目之间共享应用程序。谢谢您的评论。这两个项目不共享功能或应用程序,我需要将它们作为仅共享数据库的独立项目保留。我在编辑中更好地解释了我的需求。谢谢@alxs。我编辑了我的问题,以便更好地解释我的需求。您能帮我将数据库设置为同一路径吗?@user123892我用您请求的额外信息更新了答案。我正在获取django.db.utils.ProgrammingError:当我尝试使用其他用户和超级用户迁移第二个应用时,关系django_迁移的权限被拒绝privileges@alxs如何管理公用服务器的迁移数据库例如,我在projects_1中几乎没有迁移,我是否必须手动复制projects_2中的模型更改并运行迁移?有更好的方法吗?@nimeshkiranverma据我所知,你的每个项目中都有两个不同的应用程序副本。相反,您应该尝试让两个项目都使用一个“存在”在两个项目都可以访问的公共目录中的应用程序(如virtualenv)。正如我在上面的回答中提到的,你应该检查一下有关相关记忆的文档
# 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'
        ),
    },
}
class MyModel(models.Model):
    class Meta:
        db_table = 'MyModel'