2015-07-22 65 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! :)