赞同 9
分享
刷新

Django项目数据库主从连接配置

简介:当我们的数据库架构决定使用主从配置之后就要调查Django对数据库主从连接的支持,而django给到主从配置的完美支持并且官网已经给出例子。
  2022.02.14
  Bug Man
  9
  148
  172.17.0.1
  中国.上海
 
 

开门见山,上官网链接:Multiple databases

1.定义数据库
# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': "test",
        'USER': "test",
        'PASSWORD': "123456",
        'HOST': "xxx.xxx.xxx.41",
        'PORT': 5432,
    },
    'slave': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': "test",
        'USER': "test",
        'PASSWORD': "123456",
        'HOST': "xxx.xxx.xxx.74",
        'PORT': 5432,
    },
}

# 数据库路由配置
DATABASE_ROUTERS = [
    'common.databases_routers.MasterSlaveRouter',  # 主从数据库路由配置
]
2.数据库路由

数据库路由是用来决定ORM在查询时使用哪一个配置,同时也可以在更多的多数据库场景下去定义某一次查询应该如何选择数据库。

# databases_routers.py
class MasterSlaveRouter:
    """主从复制路由"""

    @staticmethod
    def db_for_read(model, **hints):
        """ 当xxx 读数据时,使用指定setting配置的数据库yyy """
        # if model._meta.app_label == "xxx":
        #     return "yyy"
        return "salve"

    @staticmethod
    def db_for_write(model, **hints):
        """ 当xxx应用 写的时候,使用指定setting配置的数据库yyy"""
        # if model._meta.app_label == "xxx":
        #     return "yyy"
        return "default"

    @staticmethod
    def allow_relation(obj1, obj2, **hints):
        return None

    @staticmethod
    def allow_migrate(db, app_label, model_name=None, **hints):
        """  python manage.py migrate --database=slave
            django默认迁移 default 数据库
        """
        return True
3.数据库迁移

主从同步默认情况下数据库是会从主数据库同步数据到从数据库上的,如果是这种架构那么这里我们只用关心主数据库的情况,所以在迁移的时候只要我们定义的数据库为default那么和以前单数据库迁移方式一致。如果时多个数据那么就需要用--database=slave指定迁移到slave数据库。