django 对多个数据库支持

数据库自动路由

使用多数据库最简单的方法是建立一个数据库路由模式。默认的路由模式确保对象’粘滞‘在它们原始的数据库上(例如,从foo 数据库中获取的对象将保存在同一个数据库中)。默认的路由模式还确保如果没有指明数据库,所有的查询都回归到default数据库中。

你不需要做任何事情来激活默认的路由模式 —— 它在每个Django项目上’直接‘提供。然而,如果你想实现更有趣的数据库分配行为,你可以定义并安装你自己的数据库路由。

数据库路由

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

  • db_for_read(model, **hints)
  • 建议model类型的对象的读操作应该使用的数据库。

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

    如果没有建议,则返回None

  • db_for_write(model, **hints)
  • 建议Model 类型的对象的写操作应该使用的数据库。

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

    如果没有建议,则返回None

  • allow_relation(obj1, obj2, **hints)
  • 如果obj1 和obj2 之间应该允许关联则返回True,如果应该防止关联则返回False,如果路由无法判断则返回None。这是纯粹的验证操作,外键和多对多操作使用它来决定两个对象之间是否应该允许一个关联。
  • allow_migrate(db, app_label, model_name=None, **hints)
  • 定义迁移操作是否允许在别名为db的数据库上运行。如果操作应该运行则返回True ,如果不应该运行则返回False,如果路由无法判断则返回None

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

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

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

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

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

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

    Changed in Django 1.8:

    allow_migrate的签名与以前的版本相比发生了显着更改。有关详细信息,请参阅deprecation notes

路由不必提供所有这些方法 —— 它可以省略一个或多个。如果某个方法缺失,在做相应的检查时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‘,
    },}

现在我们将需要处理路由。首先,我们需要一个路由,它知道发送auth 应用的查询到auth_db

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

我们还需要一个路由,它发送所有其它应用的查询到primary/replica 配置,并随机选择一个replica 来读取:

import randomclass 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

最后,在设置文件中,我们添加如下内容(替换path.to.为该路由定义所在的真正路径):

DATABASE_ROUTERS = [‘path.to.AuthRouter‘, ‘path.to.PrimaryReplicaRouter‘]
时间: 2024-08-11 01:18:19

django 对多个数据库支持的相关文章

在 Django 中构建 mysql 数据库支持的 Web 应用程序(linux )

运行: python 若出错说明系统没有按装python否则可越过安装python这步安装python下载 wget http://python.org/ftp/python/2.7/Python-2.7.tar.bz2 tar -jxvf Python-2.7.tar.bz2 cd Python-2.7 ./configure make all make install 安装Django下载 wget https://www.djangoproject.com/m/releases/1.8/D

Django 多数据库支持

很多时候,需要去其他数据库查询数据,都将会面临多数据库支持问题. 1.在settings文件内添加多数据库连接 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, 'test': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'pro_control', 'USER':

python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用. 本节的代码:(Django 1.6, Python 2.7 测试环境) 大

Django——连接sql server数据库

Django——连接sql server数据库 *在此注明,本人使用的是python3.5和Django2.0.4 sql server是微软出的一款闭源的可运行于windows和linux平台上的关系型数据库.由于其闭源的特性,所以较少有公司使用,但是比较神奇的是,我所在的公司和我几个朋友所在的公司业务都是以爬虫为主,都是以sql server作为主要的数据库在使用. 一.打包 如果你是使用Django的老手应该知道Django默认不支持sql server:如果你刚开始接触Django,那么

Django系列---使用MySql数据库

目录 1. 创建数据库 1.1. 使用utf8mb4编码 1.1.1. 确定mysql的配置文件 1.1.2. 修改配置文件 1.1.3. 重启数据库服务,检查相关字段 1.1.4. 新建数据库 1.2. 使用已经存在的数据库 1.2.1. 修改已有数据库的编码 1.3. 为Django项目新建一个数据库用户 2. 修改Django的配置 2.1. 修改settings.py中数据库相关 2.2. 安装mysqlclient 2.2.1. 安装mysql-connector-c 2.2.2. 修

django 中连接mysql数据库的操作步骤

django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'orm02', # 库的名字 'USER':'root', # 数据库的用户名 'PASSWORD':'666', # 数据库的密码 'HOST':'127.0.0.1', 'PORT':3306, } } 2 项目文件夹下的init文件中写上下面内容,用pymysql替

Django的orm操作数据库

Django的orm操作数据库 django学习链接:https://www.cnblogs.com/clschao/articles/10526431.html 单表操作学习链接:https://www.cnblogs.com/clschao/articles/10427807.html about mvc或者mvc框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,

<<Python基础教程>>学习笔记 | 第13章 | 数据库支持

备注:这章内容相对介绍的比较简单,不过例子比较使用,主要是要掌握如果连接,使用数据库,并以SQLite做示例 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,现在已经通过了一个标准的DB API.目前的API版本(2.0)定义在PEP249中的Python Database API Specification v2.0中. 异常 为了尽可能准确地处理错误,API中定义了一些异常.它们被定义在一种层次结构中,所以可以通过一个except块捕捉多种异常. 连

Django 反向生成 从数据库生成Model

Django 反向生成 从数据库生成Model 使用Django生成Model python manage.py inspectdb或python manage.py inspectdb > models.py 就可以生成了自动产生Django model