在Django中使用多个数据库执行迁移

时间:2017-07-06 12:23:20

标签: python django postgresql

我的项目中有2个数据库,包含多个应用。除一个以外的所有应用程序都使用默认数据库,另一个应用程序具有单独的数据库在我运行makemigrations和./manage.py migrate --database = separate_db_name之后,我仍然有未应用的默认数据库迁移暂挂。

问题是如何才能使此迁移仅对我的单独应用程序可见,而对其他应用程序(使用默认数据库)仅可见。感谢

这是我的路由器

class S3DatabaseRouter(object):
"""
Determine how to route calls for s3web_upload_dev database
"""

def db_for_read(self, model, **hints):
    """
    Attempts to read s3web_upload models to go to s3web_upload_dev
    """
    if model._meta.app_label == 's3web_upload':
        return 's3web_upload_dev'
    return None

def db_for_write(self, model, **hints):
    """
    Attempts to write s3web_upload models to go to s3web_upload_dev
    """
    if model._meta.app_label == 's3web_upload':
        return 's3web_upload_dev'
    return None

def allow_migrate(self, db, app_label, model_name=None, **hints):
    """
    Make sure the s3web_upload app only appears in the 's3web_upload_dev' database
    """
    if app_label == 's3web_upload':
        return db == 's3web_upload_dev'
    return None

1 个答案:

答案 0 :(得分:0)

对于使用默认数据库的应用程序也需要在路由器类中进行路由,请尝试以下代码。

class S3DatabaseRouter(object):
    """
Determine how to route calls for s3web_upload_dev database
"""
def db_for_read(self, model, **hints):
    """
    Attempts to read s3web_upload models to go to s3web_upload_dev
    """
    if model._meta.app_label == 's3web_upload':
        return 's3web_upload_dev'
    if app_label == 'default': # if you using custome applable use it instead of 'default'
        return 'default' # it should be the db name from settings file
    return None

def db_for_write(self, model, **hints):
    """
    Attempts to write s3web_upload models to go to s3web_upload_dev
    """
    if model._meta.app_label == 's3web_upload':
        return 's3web_upload_dev'
    if app_label == 'default':
        return 'default'
    return None

def allow_migrate(self, db, app_label, model_name=None, **hints):
    """
    Make sure the s3web_upload app only appears in the 's3web_upload_dev' database
    """
    if app_label == 's3web_upload':
        return db == 's3web_upload_dev'

    if app_label == 'default':
        return db == 'default'
    return None