zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    获取CheckBox的Text值
    动态绑定数据至Html Table
    二次事件并细化功能
    ASP.NET MVC的JavaScriptResult
    Google Earth 8.0
    ASP.NET MVC的ContentResult
    ASP.NET MVC使用input标签上传文件
    处理动态SQL语句的参数
    Infor SyteLine如何快速锁定用户
    执行git push出现"Everything up-to-date"
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/14225206.html
Copyright © 2011-2022 走看看