0

如何选择数据库路由器?我正在使用子域,如果例如app1.domain.de路由,我想更改数据库路由器。有人能帮帮我吗?

    DATABASES = {                                                                                                                                                                                                                              
'default': {                                                                                                                                                                                                                           
    'ENGINE': 'django.db.backends.sqlite3',                                                                                                                                                                                            
    'NAME': os.path.join(SITE_ROOT, 'db') + '/default.db',                                                                                                                                                                                
    'USER': '',                                                                                                                                                                                                                        
    'PASSWORD': '',                                                                                                                                                                                                                    
    'HOST': '',                                                                                                                                                                                                                        
    'PORT': '',                                                                                                                                                                                                                        
},                                                                                                                                                                                                                                     
'app1': {                                                                                                                                                                                                                         
    'ENGINE': 'django.db.backends.sqlite3',                                                                                                                                                                                            
    'NAME': os.path.join(SITE_ROOT, 'db') + '/app1.db',                                                                                                                                                                           
    'USER': '',                                                                                                                                                                                                                        
    'PASSWORD': '',                                                                                                                                                                                                                    
    'HOST': '',                                                                                                                                                                                                                        
    'PORT': '',                                                                                                                                                                                                                        
},                                                                                                                                                                                                                                     
'app2': {                                                                                                                                                                                                                             
    'ENGINE': 'django.db.backends.sqlite3',                                                                                                                                                                                            
    'NAME': os.path.join(SITE_ROOT, 'db') + '/app2.db',                                                                                                                                                                               
    'USER': '',                                                                                                                                                                                                                        
    'PASSWORD': '',                                                                                                                                                                                                                    
    'HOST': '',                                                                                                                                                                                                                        
    'PORT': '',                                                                                                                                                                                                                        
},                                                                                                                                                                                                                                     
}     

   DATABASE_ROUTERS = ['app1.routers.DatabaseRouter', 'app2.routers.DatabaseRouter']   

  /app1/routers.py                                                                                                                                                             
  class DatabaseRouter(object):                                                                                                                                                                                                                                                                                                                                                                                                                                                    
      def db_for_read(self, model, **hints):                                                                                                                                                                                                                                                                                                                                                                                                                           
         return "app1"                                                                                                                                                                                                                       

      def db_for_write(self, model, **hints):                                                                                                                                                                                                
         return "app1" 

/app2/routers.py                                                                                                                                                             
class DatabaseRouter(object):                                                                                                                                                                                                                                                                                                                                                                                                                                                    
    def db_for_read(self, model, **hints):                                                                                                                                                                                                                                                                                                                                                                                                                           
        return "app2"                                                                                                                                                                                                                       

    def db_for_write(self, model, **hints):                                                                                                                                                                                                
        return "app2" 
4

2 回答 2

0

如果数据库路由器持有请求模型的模型/表,则数据库路由器应返回数据库名称,否则应返回None。在您的情况下,您的路由器总是返回app1app2不正确。

这是有关我如何使用它的示例:

class AuditDBRouter(object):
    """
     A router to controll audit db operations
    """
    def db_for_read(self, model, **hints):
        "Point all operations on audit models to 'audit'"
        from django.conf import settings
        #admin do not want separate DB?
        if not settings.DATABASES.has_key('audit'):
            return None
        #return our DB name
        if model._meta.app_label == 'audit':
            return 'audit'
        #we don't serve this.
        return None
于 2012-09-11T13:30:15.807 回答
0

我不确定这是否是您想要的,但您可以通过简单地使用环境变量来实现此行为。

$ export DB_NAME=app1

设置DB_NAME环境变量后,您可以像这样更改 settings.py 文件以使用这个新变量:

DATABASES = {                                                                                                                                                                                                                              
  'default': {                                                                                                                                                                                                                           
    'ENGINE': 'django.db.backends.sqlite3',                                                                                                                                                                                            
    'NAME': os.path.join(SITE_ROOT, 'db') + '/' + os.environ.get('DB_NAME', 'default') + '.db',                                                                                                                                                                                
    'USER': '',                                                                                                                                                                                                                        
    'PASSWORD': '',                                                                                                                                                                                                                    
    'HOST': '',                                                                                                                                                                                                                        
    'PORT': '',                                                                                                                                                                                                                        
}

请注意,如果DB_NAME未设置,default则为您最终得到的默认值。

于 2020-01-01T17:29:23.233 回答