我需要让两个单独的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
答案 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_user
和project_2_user
)都应对您要使用的数据库具有适当的权限。或者您可以为两个项目使用相同的用户。
如果您希望每个项目只有一个数据库,则应该查看docs for multiple databases。
另一方面,由于您共享数据,我猜您也可以共享功能。例如,如果project_1_app1
和project_2_app1
执行相同(或类似)的事情,那么它们似乎可以是单个reusable app。
修改强>
由于您使用的是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'
),
},
}
这会给你要求的结构。但请注意,这些项目不是“独立”和“#34;”。 project_2
显然取决于project_1
的数据库。
在任何情况下,也许您还应该查看os.path模块以获取更多信息。
答案 1 :(得分:1)
您只需要在类meta中的模型中声明属性db_table,其名称与app +模型的名称(Django自动生成的名称)不同,两次项目都需要相同的模型。在进行makemigrations和迁移之前。
class MyModel(models.Model):
class Meta:
db_table = 'MyModel'