选择数据库路由器

时间:2012-09-11 13:17:07

标签: python django

如何选择数据库路由器?我正在使用子域名,如果例如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" 

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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作为默认值。