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‘: ‘root‘,
        ‘PASSWORD‘: ‘root‘,
        ‘HOST‘: ‘10.0.11.11‘,
        ‘PORT‘: ‘3306‘,
    }
}

如果默认数据库的概念在项目上下文中没有意义,则需要始终小心地指定要使用的数据库。Django需要一个default数据库,如果不需要使用,可以设置为空字典.

举个栗子

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‘: ‘[email protected]‘
    }
}

用例

如果你试图连接一个没有在DATABASES内定义的数据库django将产生django.db.utils.ConnectionDoesNotExist异常

将模型同步到数据库

./manage.py migrate  # 操作将同步到default数据库
./manage.py migrate --database=test  # 同步到test数据库

如果不是想所有的模型都同步到一个数据库上你可以定义一个database router,新建db_router.py文件

class AuthRouter:
    def db_for_read(self, model, **hits):
        if model._meta.app_label == ‘test01‘:
            return ‘test‘
        return None

    def db_for_write(self, model, **hits):
        if model._meta.app_label == ‘test01‘:
            return ‘test‘
        return None

    def allow_relation(self, obj1, obj2, **hits):
        if obj1._meta.app_label == ‘test01‘ or obj2._meta.app_label == ‘test01‘:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hits):
        if app_label == ‘test01‘:
            return db == ‘test‘
        return None

在setting文件内添加DATABASE_ROUTERS参数

DATABASE_ROUTERS = [‘test01.db_router.AuthRouter‘, ]

为测试model指定,在test01的models文件内写入

from django.db import models
import shortuuid

# Create your models here.

def createuuid():
    return shortuuid.uuid()

class CourseManage(models.Model):
    """课程管控表"""
    uuid = models.CharField(
        ‘ID‘,
        max_length=22,
        primary_key=True,
        default=createuuid,
        editable=False)
    add_time = models.DateTimeField(‘创建时间‘, auto_now_add=True)

    del_state_type = ((0, ‘已删除‘), (1, ‘默认‘))
    modified_time = models.DateTimeField(‘修改时间‘, auto_now=True)
    del_state = models.IntegerField(
        ‘删除状态‘, choices=del_state_type, default=1, db_index=True)
    config_status = ((1, ‘进行中‘), (2, ‘完结‘), )
    remote_id = models.CharField(verbose_name=‘远端产品id‘, max_length=30)
    status = models.PositiveSmallIntegerField(choices=config_status, default=1)

    class Meta:
        verbose_name = ‘课程‘
        verbose_name_plural = verbose_name
        db_table = ‘backend_coursemanage‘

db_table指定此模型在远端的数据库内的表名称.不然会报错

按照上述操作,便能连接并查询.

标签:当项目需要执行python manage.py makemigrations时,会发现,test01项目的migrations文件夹会产生migrations文件.并且终端也会产生提示,

可以尝试删除此migrations,来避免这个问题,allow_migrate的判断只针对真正的migrate操作.

如何选择数据库?

1.模型层

User.objects.using(‘legacy_users‘).get(username=‘fred‘)
user_obj.save(using=‘new_users‘)
user_obj.delete(using=‘legacy_users‘)

2.原生光标

from django.db import connections
with connections[‘my_db_alias‘].cursor() as cursor:
    ...

关于replication

DATABASES = {
    ‘default‘: {},
    ‘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‘,
    },
}
import random

class PrimaryReplicaRouter:
    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_name=None, **hints):
        """
        All non-auth models end up in this pool.
        """
        return True

原文地址:https://www.cnblogs.com/wuzdandz/p/10791984.html

时间: 2024-08-30 05:58:39

Django 多数据库支持的相关文章

Django之 数据库ORM

一.ORM Django的 业务 少不了 跟数据库打交道,不然没有数据库保存一些数据将是一件很糟糕的事情.Django 对 数据库 支持原生的 SQL语句,但更好的对数据库支持,Django自己有一套对数据库操作的模块,在操作.性能.便捷上 有很好的提升.ORM,Object Relational Mapping,对象关系映射.从字面意思理解,面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据.很早就有人提出,关系也可以用对象表达,这样

django之数据库orm

django之数据库orm 一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1>sqlite django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 引擎名称:django.db.backends.sqlite3 <2>mysql 引擎名称:django.db.backends.mysql 2 mysql驱动程序 MySQLdb(mysql python) mysqlclient MySQL P

Django模型-数据库操作

前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开始,进入到了Django模型,也就是数据库操作. 自带 Sqlite3 数据库查询方式 为了简单,使用Python自带的Sqlite3数据库进行实例说明. 先看一个传统的数据库操作示例: 1 from django.shortcuts import render 2 import sqlite3 3

Django入门 &#160; 数据库的ORM操作之一对多

Django对数据库的是通过ORM实现.什么叫做ORM呢?简单来说,我们通过sql语句查询一张表的所有数据的语句如下  select * from test.而Django中用到的表都是在models.py文件里定义.所以我们要查查询test表里的数据可以通过 test_obj = models.test.objects.all()来获取test表里所有数据的对象.再通过 test_obj.values()方法将每一行数据的里的各个字段以key和value的字典形式读取出来.这就叫ORM操作.

django下数据库配置

1.django默认支持sqlite.mysql.Oracle.postgresql数据库,像db2和sqlserver之类的数据库之类的数据库支持需要第三方的支持.具体详见:https://docs.djangoproject.com/en/1.9/ref/databases/ Using a 3rd-party database backend? In addition to the officially supported databases, there are backends pro

django models 数据库操作

django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class Message(models.Model): pass class Teacher(models.Model): pass class Student(models.Model): GENDER_CHOICES = ( ('male', "男"), ('female', "女&q

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第13章 | 数据库支持

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

平台主数据库支持类型及配置说明

1.主数据库支持的类型:      平台基础数据库只能用三种:SqlServer9,Oracle,Oracle11g,如下图,可以采用三种不同的驱动来连接不同的数据库, 下面就三种不同驱动加以说明:SqlServer9:用于连接SqlServer2005.SqlServer2008及更新版本的SQL SERVER数据库,该数据库采用微软提供的驱动,稳定可靠. Oracle:可用于连接所有版本的Oracle数据库,采用的是.Net提供的Oracle驱动,也就是微软for Oracle的驱动,即使用

Django Aggregation数据库聚合查询

在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序.Djngo聚合就能满足这些要求. 以下面的Model为例 from django.db import models class Author(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() class Publisher(model