django multidb --- router

之前一篇随笔, 提到了django中怎么使用多数据库, 但是在实际工程中遇到了一个问题,就是admin指定了使用某库, 在测试环境上没问题, 当部署后(库也变动了位置), 修改一个admin的model object保存后就报错.

  No such table

追溯了下源码, 没有找到问题,  但可以确定的是那个保存操作并没有使用到我们指定的数据库,使用了default.

最后是使用了django的router解决了这个问题

那么django的router是什么?

就是一个类, 定义了如下方法

db_for_read(model, **hints)
db_for_write(model, **hints)
allow_relation(obj1, obj2, **hints)
allow_syncdb(db, model)

django router有什么用?

看这个函数名我们就知道了, 我们可以决定一个model在读的时候用哪个db,  db_for_read返回一个settings.DATABASES中的db名或者None

比如在写这篇笔记实际经历的项目中, 我们要让一个叫做huodongappcms的app的所有model都读写一个远程数据库(配置为huodongapp), 我们在这个app的models中定义了么一个router

 1 class HuodongappcmsRouter(object):
 2     """
 3     A router to control all database operations on models in the
 4     this app.
 5     """
 6     def db_for_read(self, model, **hints):
 7        """
 8         Attempts to read auth models go to auth_db.
 9        """
10         if model._meta.app_label == ‘huodongappcms‘:     #model所属的app
11             return ‘huodongapp‘
12         return None
13
14     def db_for_write(self, model, **hints):
15         """
16         Attempts to write auth models go to auth_db.
17         """
18         if model._meta.app_label == ‘huodongappcms‘:
19             return ‘huodongapp‘
20         return None

然后加入settings中的DATABASE_ROUTERS, 使用Router的全路径, django会根据DATABASE_ROUTERS中router指定的顺序依次调用.

DATABASE_ROUTERS = [‘huodongappcms.models.HuodongappRouter‘]

当我添加了如上的Router后 ,我去掉了huodongapp中admin对多数据库的想关定制, 一样是work的

2. 如果我们还想让这个app以外的其它app写都写到一个主库master中, 读都随机的从两个从库slave1, slave2之一读, 那么写这样一个Router

class MasterSlaveRouter(object):
    def db_for_read(self, model, **hint):
        import random
        return random.choice([‘slave1‘, ‘slave2‘])

    def db_for_write(self, model, **hint):
        return ‘master‘

然后加入到DATABASE_ROUTERS中

3, 稍微追溯一下源码, 当需要一个db时, 拿数据库的manager举例, 会通过django.db的router去获取

而router就是django.db.utils中定义的一个类, 它使用了DATABASE_ROUTERS配置.

下面是Manager的db方法.

from django.db import router
class Manager():
    @property
    def db(self):
        return self._db or router.db_for_read(self.model)

这里只讨论了django Router的db_for_read和db_for_write

和ForeignKey相关西的allow_relation以及用于数据库同步的allow_sync以后讨论

参考:

https://docs.djangoproject.com/en/1.6/topics/db/multi-db/#automatic-database-routing

django multidb --- router,布布扣,bubuko.com

时间: 2024-08-08 05:36:22

django multidb --- router的相关文章

1000个经常使用的Python库和演示样例代码

以下是programcreek.com通过分析大量开源码,提取出的最经常使用的python库. 1. sys    (4627) 2. os    (4088) 3. re    (3563) 4. time    (3195) 5. datetime    (2214) 6. random    (2135) 7. unittest    (1928) 8. logging    (1909) 9. urllib    (1884) 10. subprocess    (1756) 11. s

[Django] ModelViewSet from rest_framework and Router

To build rest api easily, we can use ModelViewSet from rest_framework. It provides GET, POST, DELETE, PUT methods. from rest_framework.viewsets import ModelViewSet from .serializers import ListSerializer, CardSerializer from .models import List, Card

Django项目配置多个数据库

给一个项目配置多个数据库,不同app里的model对应不同的数据库 settings中的设置 1 # 设置3个数据库 2 3 DATABASES = { 4 'users_base': { 5 'ENGINE': 'django.db.backends.mysql', 6 "HOST": "127.0.0.1", 7 "NAME": "thunder_blended_learning", 8 "PASSWORD&qu

利用 Django REST framework 编写 RESTful API

利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framework 真乃一大神器,可以轻易的甚至自动化的搞定很多事情,比如: 自动生成符合 RESTful 规范的 API 支持 OPTION.HEAD.POST.GET.PATCH.PUT.DELETE 根据 Content-Type 来动态的返回数据类型(如 text.json) 生成 browserable

Django REST框架 -1

项目设置 创建一个名为Django的新项目tutorial,然后启动一个新的应用程序quickstart. # Create the project directorymkdir tutorialcd tutorial # Create a virtualenv to isolate our package dependencies locally virtualenv envsource env/bin/activate # On Windows use `env\Scripts\activa

Django学习系列之django restframework

曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful API对资源进行操作Django中有一些可选的REST framework,比如django-piston,django-tasypie. 但是我和google(呵呵,不好意思)推荐这个:Django REST framework django-framework就是定义一个url,可以利用这个url

RESTFull 的 Django

最近为了升级曾经用Django做的网站,决定升级修改下架构,而且在当今Rest风格API的架构正在一步步的渗透到各个公司的API设计中,那Django这个框架呢?当然也会例外. 现在现在以相对比较好用的rest framework做个demo: 环境:ubuntu, mysql, python, django, django-rest-framework 安装django (env)[email protected]:/usr/local$pip install django Downloadi

Django REST框架

安装 安装使用pip,包括您想要的任何可选包... pip install djangorestframework pip install markdown           # Markdown support for the browsable API. pip install django-filter        #  Filtering  support 添加 'rest_framework'  到你的 INSTALLED_APPS设置 INSTALLED_APPS = ( 're

Django rest_framework 实用技巧

前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用法 1 #################################################################### 2 ########安装和简单使用 3 ###### 准备工作 4 pip install rest_framework # 安装 5 6 INSTALL