【问题标题】:Django Multiple Databases ConnectionsDjango 多个数据库连接
【发布时间】:2019-11-14 20:38:05
【问题描述】:

我的 settings.py

中定义了两个数据库和路由器
    'default': {
    },
    'primary': { 
         'ENGINE': 'django.db.backends.postgresql',
         'NAME': ...
    },
    'auth': {
         // similar to primary
    }

DATABASE_ROUTERS = ['app.database_router.AuthRouter','app.database_router.PrimaryReplicaRouter']

我遇到了 Django 无法识别 主数据库 中的表/关系的问题。我尝试重新排序 AuthRouter 和 PrimaryRouter,但 Django 无法识别 auth 数据库 中的用户关系。有什么建议么?我尝试将其中一个设为默认值,但这也不能解决问题。

这是我的路由器,具有类似的 Auth 类:

class PrimaryReplicaRouter:
    def db_for_read(self, model, **hints):
        """
        Reads go to a read replica. We can add 'read_replica', 'write_replica'
        """
        return 'primary'

    def db_for_write(self, model, **hints):
        """
        Writes always go to primary.
        """
        return 'primary'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Relations between objects are allowed if both objects are
        in the primary/replica pool.
        """
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        All non-auth models end up in this pool.
        """
        return True

class Auth:
     def db_for_read(self, model, **hints):
        return 'auth'

    def db_for_write(self, model, **hints):
        return 'auth'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the auth app is involved.
        """
        return True

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

【问题讨论】:

    标签: python django database postgresql


    【解决方案1】:

    这只是我的经验推测,但我相信您的问题出在您的路由器文件中。更改导致更改效果的顺序是完全正常的,因为 Django 尝试按照它们在列表中的顺序使用路由器按顺序解析请求。两个路由器中的错误可能相似,因为似乎顺序中的第一个会阻止第二个正确执行。

    祝你好运,希望这对你有帮助!

    【讨论】:

    • 我也添加了路由器文件。 @CR Python 如果您发现路由器有任何问题,请告诉我?
    【解决方案2】:

    调查此类问题的一种方法是将一些打印语句放入您的代码中,然后查看model._meta.app_label 的值是什么。弄清楚这些后,只需将您的请求代理到 routers.py 文件中的正确数据库即可:

    class AuthRouter:
        def db_for_read(self, model, **hints):
            if model._meta.app_label in ['auth', 'django', 'sessions', 'admin']:
                return 'auth_db_name'
            return None
    
        def db_for_write(self, model, **hints):
            if model._meta.app_label in ['auth', 'django', 'sessions', 'admin']:
                return 'auth_db_name'
            return None
    
        def allow_relation(self, obj1, obj2, **hints):
            return True
    
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            if app_label == 'auth_db_name':
                return False
            return True
    
    class ApplicationRouter:
        def db_for_read(self, model, **hints):
            return 'app_db_name'
    
        def db_for_write(self, model, **hints):
            return 'app_db_name'
    
        def allow_relation(self, obj1, obj2, **hints):
            if obj1._state.db == 'app_db_name' and obj2._state.db == 'app_db_name':
                return True
            return False
    
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            return True
    

    确保您的settings.py 文件通过DATABASES 配置正确配置了两个数据库,并且DATABASE_ROUTER 配置也已正确设置(注意它是

    DATABASE_ROUTERS = ['routers.AuthRouter', 'routers.ApplicationRouter']
    

    参考:https://docs.djangoproject.com/en/1.8/topics/db/multi-db/

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2016-05-19
      • 2019-07-10
      • 2012-01-06
      相关资源
      最近更新 更多