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
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)
INSTALLED_APPS = [
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
‘demoapp‘
]
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
python manage.py makemigrations
python manage.py migrate
python manage.py migrate --database=users
python manage.py runserver
db 效果
以上是一个简单的操作,主要是学习下django多数据源支持的处理,多看官方文档比较好,官方文档都提供了说明
https://docs.djangoproject.com/en/3.1/topics/db/multi-db/
原文:https://www.cnblogs.com/rongfengliang/p/14225206.html