django数据库读写分离,分库

Posted 心如沚水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django数据库读写分离,分库相关的知识,希望对你有一定的参考价值。

读写分离

在settings中配置不同名称的数据库连接参数,并配置一条数据库选择路由

DATABASES = {
                        default: {
                            ENGINE: django.db.backends.sqlite3,
                            NAME: os.path.join(BASE_DIR, db.sqlite3),
                        },
                        db1: {
                            ENGINE: django.db.backends.sqlite3,
                            NAME: os.path.join(BASE_DIR, db1.sqlite3),
                        },
                    }

(1)第一种方法:

    手动选择要使用的数据库

m1.UserType.objects.using(default).create(title=VVIP)
m2.Users.objects.using(
db1).create(name=VVIP,email=xxx)

(2)方法二:

    定义一下路由类,自动执行数据类

在seetings 中加入一条配置

DATABASE_ROUTERS = [db_router.Router1,]
技术分享图片
class Router1:
                        def db_for_read(self, model, **hints):
                            """
                            Attempts to read auth models go to auth_db.
                            """
                            if model._meta.model_name == usertype:
                                return db1
                            else:
                                return default

                        def db_for_write(self, model, **hints):
                            """
                            Attempts to write auth models go to auth_db.
                            """
                            return default
为读写操作指定类

这样在执行查询和修改时候就无需指定数据库

多应用分库

创建数据库时候执行指定的命令

          app01中的表在default数据库创建
                app02中的表在db1数据库创建
                
                # 第一步:
                    python manage.py makemigraions 
                
                # 第二步:
                    app01中的表在default数据库创建
                    python manage.py migrate app01 --database=default
                
                # 第三步:
                    app02中的表在db1数据库创建
                    python manage.py migrate app02 --database=db1

对数据库迁移和读写操作进行约束

数据库迁移时进行约束:
                    class Router1:
                        def allow_migrate(self, db, app_label, model_name=None, **hints):
                            """
                            All non-auth models end up in this pool.
                            """
                            if db==db1 and app_label == app02:
                                return True
                            elif db == default and app_label == app01:
                                return True
                            else:
                                return False
                            
                            # 如果返回None,那么表示交给后续的router,如果后续没有router,则相当于返回True
                            
                        def db_for_read(self, model, **hints):
                            """
                            Attempts to read auth models go to auth_db.
                            """
                            if model._meta.app_label == app01:
                                return default
                            else:
                                return db1

                        def db_for_write(self, model, **hints):
                            """
                            Attempts to write auth models go to auth_db.
                            """
                            if model._meta.app_label == app01:
                                return default
                            else:
                                return db1

 

以上是关于django数据库读写分离,分库的主要内容,如果未能解决你的问题,请参考以下文章

ShardingJdbc-分表;分库分表;读写分离;一主多从+分表;一主多从+分库分表;公共表;数据脱敏;分布式事务

phalcon:数据库分库,读写分离,负载均衡 系统方法执行顺序

数据库之架构:主备+分库?主从+读写分离?

数据库读写分离分表分库——用Mycat

用Mycat实现数据库读写分离分表分库

学会数据库读写分离分表分库——用Mycat