Django多个DB如何编写路由器

时间:2015-07-22 08:10:23

标签: python django django-database

我有两个数据库,我写了一个 router.py 来正确管理写入和读取,但如果读取数据库默认 < / em>已关闭我无法访问写入数据库获取

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,   异步=异步)
  OperationalError:无法连接到服务器:Connection   拒绝服务器是否在主机“192.168.2.1”上运行并接受     端口5432上的TCP / IP连接?

有没有办法说django忽略与默认 db相关的失败?

1 个答案:

答案 0 :(得分:3)

错误显示您要连接的数据库不接受请求或从主机收听&#34; 192.168.2.1&#34;。

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

Lemme详细说明你应该做什么,

  1. settings.py中添加数据库信息以及有关routers.py
  2. 的信息

    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']
    
    1. 创建routers.py,它将处理在设置中提到的数据库中切换读写请求:
    2. 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! :)