本文首发于公众号:Hunter后端

原文链接:Django笔记三十七之多数据库操作(补充版)

这一篇笔记介绍一下 Django 里使用多数据库操作。

在第二十二篇笔记中只介绍了多数据库的定义、同步命令和使用方式,这一篇笔记作为补充详细介绍如何对 Django 系统的多个数据库进行针对的建表同步操作。

以下是本篇笔记目录:

  1. DATABASES 定义
  2. application创建和设置
  3. migration 和 migrate 操作
  4. 几个注意的点

1、DATABASES 定义

这里还是复用之前的 Django 系统,这里我们额外建立两个数据库连接,之前的 default 还是不变:

# hunter/settings.py

DATABASES = {
'default': {
...
},
'user': {
'ENGINE': "django.db.backends.mysql",
'NAME': "db_1",
"USER": "root",
"PASSWORD": "123456",
"HOST": "192.168.1.10",
"PORT": 3306,
},
'other': {
'ENGINE': "django.db.backends.mysql",
'NAME': "db_2",
"USER": "root",
"PASSWORD": "123456",
"HOST": "192.168.1.11",
"PORT": 3306,
},
}

数据库里的连接名称分别是 user 和 other。

注意,这里我们使用的是不同的数据库 DATABASE,分别是 db_1 和 db_2,他们可以在一个地址的 MySQL 里,也可以在不同地址。

2、application创建和设置

接下来我们以 application 为整体来指定 model 对数据库进行操作。

上面这句话这里释义一下,就是说针对多个数据库,我们这里默认使用整个 application 下的 model 表与之对应,比如说 new_user 这个 app 下的 model 的 migration 操作都写入 DATABASE 下 user 对应的数据库。

当然,这个操作过程我们还需要在 settings.py 中定义一个映射 DATABASE_APPS_MAPPING,这个我们后面再说。

创建application

首先,我们分别创建两个 application,一个 application 名为 new_user,另一个名为 other_info,使用下面的命令创建:

python3 manage.py startapp new_user

python3 manage.py startapp other_info

然后在系统的根目录会出现这两个文件夹。

然后在 settings.py 中注册这两个 app:

# hunter/settings.py

INSTALLED_APPS = [
...
'new_user.apps.NewUserConfig',
'other_info.apps.OtherInfoConfig',
...
]

application与数据库的对应设置

然后设置 application 与 DATABASE 的对应关系:

DATABASE_APPS_MAPPING = {
"new_user": "user",
"other_info": "other",
}

在这里的这个映射关系的 key 是我们的 application 的名称,value 则是 settings.py 中 DATABASES 对应的数据库的 key。

比如这里我们将 new_user 这个 app 指定到了 user 数据库。

创建 model

接下来我们分别在两个 application 下创建对应的 model:

# new_user/models.py

from django.db import models

class NewUser(models.Model):
pass class Meta:
app_label = "new_user"
# other_info/models.py

from django.db import models

class OtherInfo(models.Model):
pass class Meta:
app_label = "other_info"

在这两个 model 里,我手动给其添加了 app_label 字段,值为各自所在 application 下的名,表示这个 model 是从属于 app_label 这个 application 下。

其实对于每个 model,meta 信息下都会有这个字段,默认值为该 model 所处的 application 的名称,这里为了显示对比,我额外标记了出来。

查看 app_label 的方式为:

from new_user.models import NewUser
NewUser._meta.app_label # new_user

而在前面的 settings.py 里我们设置了 DATABASE_APPS_MAPPING 映射

DATABASE_APPS_MAPPING = {
"new_user": "user",
"other_info": "other",
}

所以这里的 NewUser model 使用的就是 user 这个数据库。

接下来我们可以进行 migration 操作来测试将表结构写入 user 数据库。

3、migration 和 migrate 操作

接下来我们创建 migration 文件:

python3 manage.py makemigrations new_user

python3 manage.py makemigrations other_info

然后会在 new_user 和 other_info 下分别创建对应的 migration 文件。

接下来进行 migrate 的时候需要指定 database 参数,也就是我们前面 settings.py 里的 DATABASES 的对应的 key:

python3 manage.py migrate new_user --database=user

python3 manage.py migrate other_info --database=other

根据 settings.py 里 DATABASE_APPS_MAPPING 里的映射关系,--database 对应的参数就是相应的数据库。

执行完上面的命令之后,在两个对应的数据库里就会创建 django_migrations 表和 model 对应的表。

创建 django_migrations 表是因为每个 database 也需要记录各自的 migration 迁移记录。

至此,我们就将 application 下的 model 和 database 对应了起来。

4、几个注意的点

数据的增删改查

前面我们将 model 和 database 对应了起来之后,在操作对应的 model 的时候还是需要 using() 来指定操作的 database:

from new_user.models import NewUser
NewUser.objects.using("user").create(id=1)

default数据库

在这篇笔记里,我们另外设置了两个数据库用于对应新建的 application,且在 DATABASE_APPS_MAPPING 中设置了 application 到 database 的映射,那么没有设置映射关系的 application 下的 model 其实就还是默认属于 default 数据库的。

比如我们之前创建的 blog 这个 application,就相当于是:

DATABASE_APPS_MAPPING = {
"blog": "default",
"new_user": "user",
"other_info": "other",
}

不过因为是默认设置,所以为了方便我们没有显式的设置出来。

并且,对于多个 application 是可以对应同一个数据库链接的,比如我们默认的 default,没有设置的 application 都对应的是 default 的数据库链接。

假设我们又创建了一个名为 article 的 app,也想要对应 other 数据库,可以这样操作:

DATABASE_APPS_MAPPING = {
"blog": "default",
"new_user": "user",
"other_info": "other",
"article": "other",
}

某 app 下设置其他 app 的 model

这个操作是否可以呢?

可以,假设我们在 new_user 下创建一个 model,但是设置的是 other_info 的 app_label:

# new_user/models.py

class OtherInfoInNewUser(models.Model):
pass class Meta:
app_label = "other_info"

然后我们对 new_user 这个 app 执行下面的操作是检测不到有新 migration 的

python3 manage.py makemigrations new_user

因为当我们 makemigrations 指定 app 名称的时候,系统会去检测这个 app 下是否有属于这个 app 的新的 model 变化,而我们设置 OtherInfoInNewUser 这个 model 却从属于 other_info,所以是检测不到变化的。

只有当我们执行:

python3 manage.py makemigrations other_info

这个操作的时候,系统才会检测到 app_label='other_info' 的 model 的变化,然后创建新的 migration。

上面这个操作虽然是可行的,但是为了统一管理,还是不推荐这么操作。

如果想获取更多后端相关文章,可扫码关注阅读:

Django笔记三十七之多数据库操作(补充版)的更多相关文章

  1. Django笔记三之使用model对数据库进行增删改查

    本篇笔记目录索引如下: model 准备 增 查 删 改 1.model 准备 在上一篇笔记中,我们新建了一个 application,增加了几个model 同步到了数据库,这次我们新建一个名为 bl ...

  2. Django笔记三十二之session登录验证操作

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十二之session登录验证操作 这一篇笔记将介绍 session 相关的内容,包括如何在系统中使用 session,以及利用 sess ...

  3. Django笔记三十三之缓存操作

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十三之缓存操作 这一节介绍一下如何在 Django 中使用 redis 做缓存操作. 在 Django 中可以有很多种方式做缓存,比如数 ...

  4. 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化

    第三百零九节,Django框架,models.py模块,数据库操作——F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...

  5. 第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多

    第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多.一对一.多对多 链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.Forei ...

  6. 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  7. 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

  8. Django笔记二十七之数据库函数之文本函数

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十七之数据库函数之文本函数 这篇笔记将介绍如何使用数据库函数里的文本函数. 顾名思义,文本函数,就是针对文本字段进行操作的函数,如下是目 ...

  9. 五 Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  10. 四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

随机推荐

  1. 关于PB用JDBC连接MySQL,亲测有效

    以前自学过一段时间的PB,数据窗口让人印象深刻,前段时间,在西瓜视频看到有人录制了PB的教学视频,让我想起以前自学的那段时光,遇到了问题,也不知道问谁,现在网络发达,可以在网上查找问题,但是有大多数博 ...

  2. Oracle-安装问题:Win10系统离线安装framework3.5报0x8024402c的问题

    Oracle-安装问题:Win10系统离线安装framework3.5报0x8024402c的问题 像神州信用政府版本相关的系统都不允许联网,也就需要离线安装下,Net3.5之类的文件 具体步骤可以参 ...

  3. Windows 下TCP长连接保持连接状态TCP keepalive设置

    TCP长连接建立完成后,我们通常需要检测网络的连接状态,以反馈给客户做响应的处理.通过设置TCP keepalive的属性,打开socket的keepalive属性,并设置发送底层心跳包的时间间隔.T ...

  4. 在golang中如何正确判断接口是否为nil

    本文主要来分析一下在golang中,如何判断interface是否为nil,以及相关注意事项. 正常情况下,我们声明一个interface类型的变量,默认值将会返回nil,以golang自带的io.W ...

  5. J - Straight Master Gym - 101775J 差分

    题意:纸牌顺子:连续的3张或连续的4张或连续的5张为顺子.手中的牌共有n个数字,每个数字是a[i]个,能不能把手中所有的牌都是属于顺子. 1 ≤ T ≤ 100. 1 ≤ N ≤ 2 × 105. 0 ...

  6. 被冰封的 Bug:Fishhook Crash 修复纪实

    作者:郝连福,业界资深计算机技术专家,现任声网Agora 首席前端架构师.先后担任过 Principal Engineer/Engineering Director(UTStarcom).Sr. ar ...

  7. windows作业系统部署nfs服务

    文件共享的需求是如何产生的? 据说当年美国和苏联冷战期间,双方都有摧毁对方的能力.而苏联 不怕死的性格让美国人多少有些害怕.美国当时害怕自己的军事指挥中心被苏联摧毁.于是,美国建立了阿帕网,并把自己的 ...

  8. 【Unity3D】基于粒子系统实现烟花特效

    1 需求实现 ​ 粒子系统ParticleSystem 中介绍了粒子初始化.粒子发射.发射器形状.渲染器.碰撞.子发射器.拖尾等粒子系统的基本用法,本节将基于粒子系统实现烟花特效. ​ 实现需求如下( ...

  9. day12-SpringBoot数据库操作

    SpringBoot数据库操作 1.JDBC+HikariDataSource 在SpringBoot 2.x项目中,默认使用Hikari连接池管理数据源.相比于传统的 C3P0 .DBCP.Tomc ...

  10. 在java中new一个对象的流程是什么?

    Dog dog=new Dog()背后执行过程 这个涉及到字节码文件结构,类加载机制,堆,栈的认识等知识点. 在执行new的时候可以大致分为二个过程,初始化以及实例化,初始化就是类的加载过程,首先我们 ...