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/

posted on   荣锋亮  阅读(1248)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-01-03 java 应用使用jfr+sjk 生成应用火焰图
2020-01-03 使用btrace 分析java 应用
2020-01-03 vigil监控以及webhook使用
2019-01-03 masterlab 敏捷项目管理工具
2019-01-03 luarocks 自定义包发布试用
2018-01-03 jest js 测试框架-简单方便人性化
2014-01-03 Nginx 安装成Windows 服务方法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示