django 多数据源配置

django 内置了数据的orm 处理以及schema 处理,所以如果需要处理多数据源,那么我们就需要在
migrate以及crud的时候进行处理了,django 提供了方便的多数据源支持处理,migrate 的时候指定
依赖的数据库就可以进行migrate的处理了,对于crud,django 支持数据路由,我们只需要配置自己的
路由规则就可以了,以下是一个简单的试用

环境准备

这个比较简单,我们使用提供的cli 就可以了

  • 项目结构
 
├── demoapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── multisource
    ├── __init__.py
    ├── asgi.py
    ├── mydbrouter.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
  • 代码说明
    models.py
 
from django.db import models
# Create your models here.
class MyUser(models.Model):
    name = models.CharField(max_length=255)
    age = models.IntegerField()

admin.py

from django.contrib import admin
# Register your models here.
from .models import MyUser
admin.site.register(MyUser)
  • 安装app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'demoapp'
]

配置多数据源

  • 配置datasource
    settings.py
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'users': {
        'NAME': BASE_DIR / 'db2.sqlite3',
        'ENGINE': 'django.db.backends.sqlite3',
    }
}
  • 创建数据路由规则

    主要是对于demoapp 的app 直接路由到users,包含了读以及写,同时也创建了以下relation 以及migrate的规则
    mydbrouter.py

 
class MyUserRouter:
    route_app_labels = {'demoapp'}
    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'users'
        return None
    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'users'
        return None
    def allow_relation(self, obj1, obj2, **hints):
        if (
                obj1._meta.app_label in self.route_app_labels or
                obj2._meta.app_label in self.route_app_labels
        ):
            return True
        return None
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'users'
        return None

试用

  • 进行migrate操作
 python manage.py makemigrations 
  • admin migrate
python manage.py migrate
  • users migrate
python manage.py migrate --database=users
  • 启动操作
python manage.py runserver
 

django 多数据源配置_分享

 

 


django 多数据源配置_分享_02

 

 


db 效果
django 多数据源配置_分享_03

 

 

说明

以上是一个简单的操作,主要是学习下django多数据源支持的处理,多看官方文档比较好,官方文档都提供了说明

参考资料

https://docs.djangoproject.com/en/3.1/topics/db/multi-db/