【问题标题】:Performing migrations with multiple databases in Django在 Django 中使用多个数据库执行迁移
【发布时间】:2017-07-06 12:23:20
【问题描述】:

我的项目中有 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

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    对于使用默认数据库的应用程序也需要在路由器类中进行路由,试试下面的代码它应该可以工作。

    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
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2016-06-07
      • 2014-01-13
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2018-03-04
      • 2016-12-09
      相关资源
      最近更新 更多