无论我在使用./manage.py migrate
时使用什么数据库,它都会将所有表迁移到数据库中。
目标是能够拥有一个应用程序,该应用程序中的所有模型都将进入单独的数据库,而其他模型(如django-admin)将变为默认数据库。
我希望当我不针对任何数据库时,它将所有现有迁移(而不是在我的新应用中)迁移到default
数据库连接。
然后,当我运行./manage.py migrate --database=otherdatabase
时,它只会在新应用中迁移那些模型,或者根本不迁移。
这可能是一个错误的期望,但这是我对应该发生的事情的理解。
无论我在使用./manage.py migrate
时使用什么数据库,它都会将所有表迁移到数据库中。
version: "3"
services:
db:
image: postgres:10.1-alpine
environment:
POSTGRES_DB: "database1"
POSTGRES_USER: "postgres"
ports:
- 5432:5432
psycopg2-binary
和Django
django-admin.py startproject routing
routing/settings.py
,将以下内容添加到数据库中DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'database1',
'USER': 'postgres',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '5432',
},
'database2': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'database2',
'USER': 'postgres',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '5432',
}
}
database2
./manage.py startapp integrations
integrations
应用添加到INSTALLED_APPS
中的settings.py
router.py
应用中创建文件integrations
APP_LABEL = "integrations"
DB_CONNECTION_NAME = "database2"
class IntegrationRouter:
def db_for_read(self, model, **hints):
if model._meta.app_label == APP_LABEL:
return DB_CONNECTION_NAME
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == APP_LABEL:
return DB_CONNECTION_NAME
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == APP_LABEL or obj2._meta.app_label == APP_LABEL:
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == APP_LABEL:
return db == DB_CONNECTION_NAME
return None
settings.py
中添加以下内容以使用数据库路由器DATABASE_ROUTER = ['integrations.router.IntegrationRouter']
./manage.py migrate
。它应该运行所有迁移./manage.py migrate --database=database2
。不应运行任何迁移,但应在我的系统上进行。