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
db 效果
说明
以上是一个简单的操作,主要是学习下django多数据源支持的处理,多看官方文档比较好,官方文档都提供了说明
参考资料
https://docs.djangoproject.com/en/3.1/topics/db/multi-db/