- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本文首发于公众号:Hunter后端 。
原文链接: Django笔记三十七之多数据库操作(补充版) 。
这一篇笔记介绍一下 Django 里使用多数据库操作.
在第二十二篇笔记中只介绍了多数据库的定义、同步命令和使用方式,这一篇笔记作为补充详细介绍如何对 Django 系统的多个数据库进行针对的建表同步操作.
以下是本篇笔记目录:
这里还是复用之前的 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 里,也可以在不同地址.
接下来我们以 application 为整体来指定 model 对数据库进行操作.
上面这句话这里释义一下,就是说针对多个数据库,我们这里默认使用整个 application 下的 model 表与之对应,比如说 new_user 这个 app 下的 model 的 migration 操作都写入 DATABASE 下 user 对应的数据库.
当然,这个操作过程我们还需要在 settings.py 中定义一个映射 DATABASE_APPS_MAPPING,这个我们后面再说.
首先,我们分别创建两个 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 与 DATABASE 的对应关系:
DATABASE_APPS_MAPPING = {
"new_user": "user",
"other_info": "other",
}
在这里的这个映射关系的 key 是我们的 application 的名称,value 则是 settings.py 中 DATABASES 对应的数据库的 key.
比如这里我们将 new_user 这个 app 指定到了 user 数据库.
接下来我们分别在两个 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 数据库.
接下来我们创建 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 对应了起来.
前面我们将 model 和 database 对应了起来之后,在操作对应的 model 的时候还是需要 using() 来指定操作的 database:
from new_user.models import NewUser
NewUser.objects.using("user").create(id=1)
在这篇笔记里,我们另外设置了两个数据库用于对应新建的 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",
}
这个操作是否可以呢?
可以,假设我们在 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笔记三十七之多数据库操作(补充版)的文章就讲到这里了,如果你想了解更多关于Django笔记三十七之多数据库操作(补充版)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
1.枚举类型 1.枚举数据类型是C语言中一种构造数据类型,可以让数据更加简洁,更易读,对于只有 几个特定的数据 ,可以使用枚举类型 2.枚举对应英文enumeration,简写为enum
PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助。 1.print_r() 打印关于变量的易于理解的信息,若为数组,则显示数组的结构信息. 例如
〇、前言 本文继续整理下 K8s 的一些基础概念,作为前一篇概念汇总的补充。 前一篇博文链接:https://www.cnblogs.com/hnzhengfy/p/k8s_concept.htm
我从文件资源管理器重命名了一个文件,然后我将新文件添加到 SVN 并从终端删除了之前的文件。然后 svn 显示 D A 一旦我做了 svn rename 我发现 svn 也在做同样的事情 D A
int a=1; // a=1 in binary representation 0000 0000 0000 0000 0000 0000 0000 0001 int b =~a; 1111 111
我们有这样两个互补 map 的代码: private final Map idToName = new HashMap(); private final Map nameToID = new Tree
无阻塞加载javascript,对于页面性能优化有很大的作用,这样能有效的减少js对页面加载的阻塞。特别是一些广告js文件,由于广告内容有可能是富媒体,更是很可能成为你页面加载提速的瓶颈,高性能ja
这种业务灵活性可使企业加快发展速度,降低总体拥有成本,改善对及时、准确信息的访问。SOA 有助于实现更多的资产重用、更轻松的管理和更快的开发与部署,在当今的业务环境中,变化是毫无疑问的,因此快速响应
1、错误处理 异常处理: 意外,是在程序运行过程中发生的意料这外的事,使用异常改变脚本正常流程 PHP5中的一个新的重要特性 复制代码代码如下: if()
假设我有一个 DNA 序列。我想得到它的补充。我使用了以下代码,但我没有得到它。我究竟做错了什么 ? s=readline() ATCTCGGCGCGCATCGCGTACGCTACTAGC p=unl
在What does the ^ operator do in Java?下提出了类似的问题 但我认为缺少了一些东西。 根据 @Carl Smotricz 的说法,当我们有一个例子时:“定义按位异或的
我有一个自定义的 UICollectionViewLayout,它利用 iOS 8 中的自调整大小机制。我的 UICollectionViewCell 的实现 preferredLayoutAttri
我正在使用 UICollectionViewController。在某些时候,我需要对可见页脚进行一些配置,对于每一个页脚,我都需要知道它的当前节号。当前,因为部分可能会被替换,并且可重用 View
在 Windows C++ 中工作并使用 GetCommandLine 获取函数中的参数。是否有类似的函数可以返回命令行中的参数数量? 我无法从 main 获取它,因为我正在使用 int WINAPI
我有一个带有 VideoView 的应用程序,它将不断循环播放相同的视频,直到用户对设备(触摸屏等)进行操作为止。目前,我正在使用 OnCompletionListener() 在视频结束后重新启动视
我有一个基于 BizTalk 的 WCF 服务,我不确定它是如何部署或生成的,但据我所知,它是使用 BizTalk 向导创建的,用于发布 WCF 服务。问题是 BizTalk 服务器安装已被删除,现在
我希望在我的 Collection View 的部分上放置一个标题。我有一个嵌入在 tablebview 中的 collectionview 。使用 TableView 的节标题会使标题离内容太远。将
我有一个 bool 字符串列表。每个字符串的长度为 6。我需要得到每个字符串的补码。例如,如果字符串是“111111”,则应为“000000”。我的想法是 bin(~int(s,2))[-6:] 将其
好吧,这就是问题所在,标题部分单元格的默认行为是粘在 Collection View 框架的顶部,进行了一些挖掘,但找不到删除此默认行为的方法,如果有人有线索的话怎么做,请分享。 这样做的主要原因是我
我有一个 UICollectionViewLayout 子类,其中包含一个包含多行 UILabel 的补充 View 。问题是并非所有文本在某个点都是可见的,我怎样才能让补充 View 的高度等于它的
我是一名优秀的程序员,十分优秀!