2015-07-22 23 views
1

我有两个数据库,我写了一个router.py是正确处理的写入和读取,但如果读分贝默认下跌我无法访问还写DB获得Django的多个数据库怎么写路由器

class TestRouter(object): 

    def db_for_read(self, model, **hints): 

     if model._meta.app_label == 'read_app': 
      return 'default' 
     if model._meta.app_label == 'write_app': 
      return 'write_db'   
     return None 

    def db_for_write(self, model, **hints): 

     if model._meta.app_label == 'write_app': 
      return 'write_db' 
     return None 

settings.py

DATABASE_ROUTERS = ['prj.dbrouter.TestRouter', ] 

这是错误:

cnn = _connect(dsn, connection_factory=connection_factory, async=async)
OperationalError: could not connect to server: Connection refused Is the server running on host "192.168.2.1" and accepting TCP/IP connections on port 5432?

是有没有办法说的Django忽略失败连接默认分贝?

回答

2

错误显示您要连接的数据库未接受请求或正在侦听主机“192.168.2.1”。

postgresql.conf文件,更改listen_addresses = '*'

让我再细说,你应该做的事情,

  1. settings.py也信息添加有关routers.py数据库的信息:

settings.py

DATABASES = { 
    'default': {}, 
    'master': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': '', 
     'USER': '', 
     'PASSWORD': '', 
     'HOST': '', 
     'PORT': 5432, 
    }, 
    'slave': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': '', 
     'USER': '', 
     'PASSWORD': '', 
     'HOST': '', 
     'PORT': 5432, 
    } 
} 
SLAVE_DATABASES = ['slave'] 

DATABASE_ROUTERS = ['path.to.your.routers.MasterSlaveRouter'] 
  • 创建routers.py将处理切换读取和写入设置中提到的数据库中的要求:如果是这样,现在
  • routers.py

    from django.conf import settings 
    import socket 
    
    
    def test_connection_to_db(database_name): 
        try: 
         db_definition = getattr(settings, 'DATABASES')[database_name] 
         s = socket.create_connection(
          (db_definition['HOST'], db_definition['PORT']), 5) 
         s.close() 
         return True 
        except: 
         return False 
    
    
    class MasterSlaveRouter(object): 
        def db_for_read(self, model, **hints): 
         """ 
         Reads go to a randomly-chosen slave. 
         """ 
         if test_connection_to_db('master'): 
          return 'master' 
         return 'slave' 
    
        def db_for_write(self, model, **hints): 
         """ 
         Writes always go to master. 
         """ 
         if test_connection_to_db('master'): 
          return 'master' 
         return 'slave' 
    
        def allow_relation(self, obj1, obj2, **hints): 
         """ 
         Relations between objects are allowed if both objects are 
         in the master/slave pool. 
         """ 
         db_list = ('master', 'slave') 
         if obj1._state.db in db_list and obj2._state.db in db_list: 
          return True 
         return None 
    
        def allow_migrate(self, db, model): 
         """ 
         All non-auth models end up in this pool. 
         """ 
         return True 
    

    您主人失望了,奴隶已经起来了。请求将被相应转移,反之亦然。确保任何一个数据库已启动。

    HTH! :)