我有一个包含多个应用程序的Django项目。我希望将其中一个应用程序(名为warehouse
)转到特定的数据库(也称为warehouse
),但是它似乎无法正常工作。当我从命令行(python manage.py migrate warehouse
)迁移此应用程序时,收到一条成功消息:
>>> python manage.py migrate warehouse
Operations to perform:
Apply all migrations: warehouse
Running migrations:
Applying warehouse.0001_initial... OK
迁移出现在default
数据库中,这是错误的,但是没有创建表,这是正确的。如果我将命令更改为以下内容:
>>> python manage.py migrate warehouse --database=warehouse
这些表正确显示在我的warehouse
数据库中,迁移也一样。如何更改内容,以便第一个命令引发错误,或者至少指示给定的应用程序无法应用于默认数据库?
这是我的设置:
settings.py中的数据库设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'projects',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
},
'warehouse': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'projects-warehouse',
'USER': 'otheruser',
'PASSWORD': 'otherpassword',
'HOST': 'localhost',
'PORT': '5432',
},
}
DATABASE_ROUTERS = ['warehouse.dbrouter.WarehouseRouter', 'base.dbrouter.BaseRouter']
dbrouter.py [仓库应用]
class WarehouseRouter:
def db_for_read(self, model, **hints):
if(model._meta.app_label == 'warehouse'):
return 'warehouse'
return None
def db_for_write(self, model, **hints):
if(model._meta.app_label == 'warehouse'):
return 'warehouse'
return None
def allow_relation(self, obj1, obj2, **hints):
if(obj1._meta.app_label == 'warehouse' and
obj2._meta.app_label == 'warehouse'):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if(app_label == 'warehouse'):
return db == 'warehouse'
return None
dbrouter.py [所有其他应用程序]
class BaseRouter:
def db_for_read(self, model, **hints):
return 'default'
def db_for_write(self, model, **hints):
return 'default'
def allow_relation(self, obj1, obj2, **hints):
if(obj1._state.db == "default" and obj2._state.db == "default"):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
return db == 'default'
答案 0 :(得分:0)
您使用数据库来持久化模型,而Django也使用数据库来跟踪迁移,如果您在迁移应用程序时未指定任何数据库名称,则Django将使用"default"
数据库来存储模型。迁移元数据。
这是预期的行为。当您这样做时:
>>> python manage.py migrate warehouse
Django将迁移保存到默认数据库中,并且由于warehouse
而使表进入WarehouseRouter
数据库。
,然后再执行以下操作:
>>> python manage.py migrate warehouse --database=warehouse
然后Django“知道”它必须将迁移放置在“默认”数据库的另一个位置。
我还没有进行测试,但是我认为即使没有WarehouseRouter
,它也可以正常工作(迁移和创建表,不向模型写入数据和从模型读取数据)。