django多数据库

关系数据库

DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit'
    },
    'users': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'priv4te'
    }
}
DATABASES = {
    'default': {},
    'users': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'superS3cret'
    },
    'customers': {
        'NAME': 'customer_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_cust',
        'PASSWORD': 'veryPriv@ate'
    }
}

migrate 管理命令一次操作一个数据库。默认情况下,它在default 数据库上操作,但是通过提供一个–database 参数,你可以告诉migrate 同步一个不同的数据库。

$ ./manage.py migrate
$ ./manage.py migrate --database=users

如果你不想每个应用都被同步到同一台数据库上,你可以定义一个 数据库路由

数据库路由是一个类,它提供4个方法:

如果一个数据库操作能够提供其它额外的信息可以帮助选择一个数据库,它将在hints字典中提供。合法的hints 的详细信息在下文给出。

如果没有建议,则返回None。

如果一个数据库操作能够提供其它额外的信息可以帮助选择一个数据库,它将在hints字典中提供。 合法的hints 的详细信息在下文给出。

如果没有建议,则返回None。

位置参数app_label 是正在迁移的应用的标签。

大部分迁移操作设置model_name的值为正在迁移的模型的model. _meta.model_name(模型的__name__ 的小写)。对于RunPython和RunSQL 操作它的值为None,除非这两个操作使用hint 提供它。

hints 用于某些操作来传递额外的信息给路由。

当设置了model_name时,hints 通常通过键’model’包含该模型的类。注意,它可能是一个历史模型,因此不会有自定的属性、方法或管理器。你应该只依赖_meta。

这个方法还可以用来决定一个给定数据库上某个模型的可用性。

注意,如果这个方法返回False,迁移将默默地不会在模型上做任何操作。这可能导致你应用某些操作之后出现损坏的外键、表多余或者缺失。

路由不必提供所有这些方法 —— 它可以省略一个或多个。如果某个方法缺失,在做相应的检查时Django 将忽略该路由。

DATABASES = {
    'auth_db': {
        'NAME': 'auth_db',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'swordfish',
    },
    'primary': {
        'NAME': 'primary',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'spam',
    },
    'replica1': {
        'NAME': 'replica1',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'eggs',
    },
    'replica2': {
        'NAME': 'replica2',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'bacon',
    },
}

class AuthRouter(object):
"""
    A router to control all database operations on models in the
    auth application.

"""
    def db_for_read(self, model, **hints):
"""
        Attempts to read auth models go to auth_db.

"""
        if model._meta.app_label == 'auth':
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
"""
        Attempts to write auth models go to auth_db.

"""
        if model._meta.app_label == 'auth':
            return 'auth_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
"""
        Allow relations if a model in the auth app is involved.

"""
        if obj1._meta.app_label == 'auth' or \
           obj2._meta.app_label == 'auth':
           return True
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
"""
        Make sure the auth app only appears in the 'auth_db'
        database.

"""
        if app_label == 'auth':
            return db == 'auth_db'
        return None
import random

class PrimaryReplicaRouter(object):
    def db_for_read(self, model, **hints):
"""
        Reads go to a randomly-chosen replica.

"""
        return random.choice(['replica1', 'replica2'])

    def db_for_write(self, model, **hints):
"""
        Writes always go to primary.

"""
        return 'primary'

    def allow_relation(self, obj1, obj2, **hints):
"""
        Relations between objects are allowed if both objects are
        in the primary/replica pool.

"""
        db_list = ('primary', 'replica1', 'replica2')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
"""
        All non-auth models end up in this pool.

"""
        return True
DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.PrimaryReplicaRouter']
>>>
>>> Author.objects.all()

>>>
>>> Author.objects.using('default').all()

>>>
>>> Author.objects.using('other').all()

对Model.save()使用using 关键字来指定数据应该保存在哪个数据库。
例如,若要保存一个对象到legacy_users 数据库,你应该使用:

>>> my_object.save(using='legacy_users')

默认情况下,删除一个已存在对象的调用将在与获取对象时使用的相同数据库上执行:

>>> user_obj.save(using='new_users')
>>> user_obj.delete(using='legacy_users')

Django 的管理站点没有对多数据库的任何显式的支持。如果你给数据库上某个模型提供的管理站点不想通过你的路由链指定,你将需要编写自定义的ModelAdmin类用来将管理站点导向一个特殊的数据库。

ModelAdmin 对象具有5个方法,它们需要定制以支持多数据库:

class MultiDBModelAdmin(admin.ModelAdmin):

    using = 'other'

    def save_model(self, request, obj, form, change):

        obj.save(using=self.using)

    def delete_model(self, request, obj):

        obj.delete(using=self.using)

    def get_queryset(self, request):

        return super(MultiDBModelAdmin, self).get_queryset(request).using(self.using)

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):

        return super(MultiDBModelAdmin, self).formfield_for_foreignkey(db_field, request=request, using=self.using, **kwargs)

    def formfield_for_manytomany(self, db_field, request=None, **kwargs):

        return super(MultiDBModelAdmin, self).formfield_for_manytomany(db_field, request=request, using=self.using, **kwargs)

redis


from .redis_pools import master,slave1,slave2

import redis
master=redis.ConnectionPool(host='127.0.0.1',port=6379)
slave1=redis.ConnectionPool(host='127.0.0.1',port=6380)
slave2=redis.ConnectionPool(host='127.0.0.1',port=6381)
from pool import master,salve1,slave2
import redis
writer=redis.Redis(connection_pool=master)
reader1=redis.Redis(connection_pool=slave1)
reader2=redis.Redis(connection_pool=slave2)

writer.set('username','general_zy',60)
reader1.get('username')
reader2.get('username')
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
        }
    },
    "user": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6380",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
        }
    }
}
from django_redis import get_redis_connection
conn=get_redis_connection('default')
user=get_redis_connection('default')
conn.set('username','general_zy')
user.get('username')
from django.core.cache import cache
cache.set('username','general_zy')
cache.get('username')

Original: https://blog.csdn.net/General_zy/article/details/122270774
Author: General_zy
Title: django多数据库

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/734028/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • c++ 翻译oc 中的hash

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/pythonywy/p/16627641.htmlAut…

    Python 2023年6月15日
    065
  • 【毕业设计】深度学习人脸性别年龄识别系统 – python

    文章目录 0 前言 1 课题描述 2 实现效果 3 算法实现原理 * 3.1 数据集 3.2 深度学习识别算法 3.3 特征提取主干网络 3.4 总体实现流程 4 具体实现 * 4…

    Python 2023年9月29日
    062
  • Novel-AI作图实现

    Novel-AI作图实现 闲来无事,便找一些有趣的AI算法来体验一下,以下内容将记录Novel-AI作图的实现过程。github网址:https://github.com/AUTO…

    Python 2023年10月26日
    045
  • 跟苏朗写游戏(4)

    前言 我们这个游戏已经要接近尾声了,上次我们做了游戏主角色并让他移动,今天我们要增加敌方车辆。 教程与代码 生成车辆 先上代码 import pyglet as pclass ca…

    Python 2023年9月20日
    024
  • python –xarray绘图

    文章目录 * – 基础绘图:.plot() – 进阶绘图–axes 首先导入数据以及相关库: import xarray as xr impor…

    Python 2023年9月1日
    072
  • python瀑布图怎么做_用Matplotlib模拟原始瀑布图

    更新:由于您已经更新了您的问题,以便更清楚地了解您的目标,让我演示三种不同的绘制此类数据的方法,它们都有很多优点和缺点。 总的要领(至少对我来说是)在3D中,{}是不好的,尤其是当…

    Python 2023年9月5日
    055
  • 京东云开发者|经典同态加密算法Paillier解读 – 原理、实现和应用

    摘要 随着云计算和人工智能的兴起,如何安全有效地利用数据,对持有大量数字资产的企业来说至关重要。同态加密,是解决云计算和分布式机器学习中数据安全问题的关键技术,也是隐私计算中,横跨…

    Python 2023年10月16日
    054
  • pytest系列教程——8、fixture函数中使用参数

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年9月12日
    055
  • python Scrapy爬取天气预报,零基础的你也可以快速上手

    目的 写一个真正意义上一个爬虫,并将他爬取到的数据分别保存到txt、json、已经存在的mysql数据库中。 目标分析: 初学者有什么不懂的可以私信我——我刚整理了一套2021最新…

    Python 2023年10月2日
    054
  • python学习笔记——flask之response

    一、返回响应体数据 直接return返回就好 coding:utf-8 from flask import Flask app = Flask(__name__) @app.rou…

    Python 2023年8月14日
    072
  • ES系列二之常见问题解决

    上篇ES系列一之java端API操作结束后本以为就相安无事了,但生产的问题是层出不穷的;下面我就再记录下近几周遇到的问题以及解决方案; 一 更新ES信息报错 报错信息如下: Use…

    Python 2023年10月14日
    049
  • Pytorch/Tensor/Numpy中的广播机制——Broadcast

    根据线性代数的运算规则我们知道,矩阵运算往往都是在两个矩阵维度相同或者相匹配时才能运算。比如加减法需要两个矩阵的维度相同,乘法需要前一个矩阵的列数与后一个矩阵的行数相等。那么在 n…

    Python 2023年8月24日
    042
  • scrapy项目–苏宁图书栏目内容爬虫

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年10月5日
    060
  • 初学Scrapy

    1、items.py 像字典一样 定义所爬取信息的名字,相当于规定好要提取信息的Key键 2.spiders包中 用来请求和解析 默认起始爬取链接、request请求、def pa…

    Python 2023年10月3日
    034
  • 编译器优化丨Cache优化

    摘要:本文重点介绍几种通过优化Cache使用提高程序性能的方法。 软件开发人员往往期望计算机硬件拥有无限容量、零访问延迟、无限带宽以及便宜的内存,但是现实却是内存容量越大,相应的访…

    Python 2023年10月13日
    043
  • 配置服务器:Linux 使用 conda 我所遇到的所有坑

    熟悉三妹的小伙伴可能知道,三妹最近跳槽到了互联网,成为了 BAT 中的一个小小程序媛,因此 Mac 呀、服务器呀都是新的,如同一张白纸要被我配置成我喜欢的样子。 坦白说,我是相当不…

    Python 2023年9月8日
    0115
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球