Django:同一个app支持多个数据库
我以我个人的Mynote工程说明,目的是要在backend这个app里面设置不同的model对应daysn和bear两个数据库进行操作
现在我们先简单对一个完全新建的django工程配置一个自动在mysql生成表的这么一个东西,
配置setting
然后随便写个model
然后
E:\大数据\DjangoMyNote\Mynote>python manage.py makemigrations backend
Migrations for 'backend':
backend\migrations\0001_initial.py
- Create model test E:\大数据\DjangoMyNote\Mynote>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, backend, contenttypes, sessions
Running migrations:
Applying backend.0001_initial... OK
然后就创建了一个表,好,这是前提。ps,其他表先建了
好,从这里开始记录一个完整的一个app对应多个数据库的过程,综合了n篇博客妈的没有一篇靠谱
首先我们建立一个空的app,假设叫another
那么我们在我们的主工程的setting肯定要注册进去,顺便配置一下我们的数据库连接
DATABASES = {
#系统默认加载的数据库daysn,于是这里的数据库连接名为default
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'daysn',
'USER':'root',
"PASSWORD":'',
"HOST":"*.*.*.*",
"PORT":"",
"CONN_MAX_AGE":*,
},
#系统加载的数据库第二个bear,于是这里的数据库连接名为default
'default2': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'bear',
'USER':'root',
"PASSWORD":'',
"HOST":"*。*。*。*",
"PORT":"",
"CONN_MAX_AGE":*,
},
}
#待会我们在主工程的目录下新建一个DatabaseAppRouter文件,里面定义了一个DatabaseAppsRouter的class
DATABASE_ROUTERS = ['Mynote.DatabaseAppRouter.DatabaseAppsRouter']
#两个应用对应不同的数据库
DATABASE_APPS_MAPPING = {
'backend': 'default',
'another': 'default2',
}
好,现在我们新建一个路由就像上面说的
然后下面这段代码完全copy
# -*- coding: utf- -*-
from django.conf import settings DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING class DatabaseAppsRouter(object):
"""
A router to control all database operations on models for different
databases. In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
will fallback to the `default` database. Settings example: DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
""" def db_for_read(self, model, **hints):
""""Point all read operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None def db_for_write(self, model, **hints):
"""Point all write operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation between apps that use the same database."""
db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None # for Django 1.4 - Django 1.6
def allow_syncdb(self, db, model):
"""Make sure that apps only appear in the related database."""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(model._meta.app_label) == db
elif model._meta.app_label in DATABASE_MAPPING:
return False
return None # Django 1.7 - Django 1.11
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure that apps only appear in the related database.
根据app_label的值只在相应的数据库中创建一个表,如果删除该def或
不指定过滤条件,则一个Model会在每个数据库里都创建一个表。
"""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None
然后我们可以去写我们的类了,因为我们的目的是要在backend这个app里面设置不同的model同时对应daysn和bear这两个数据库
那么测试如下,在backend的model.py里面加入这些玩意儿
from django.db import models # Create your models here. class test(models.Model):
test_id = models.IntegerField()
test_a_id = models.IntegerField() class mt(models.Model):
test_id = models.IntegerField()
test_a_id = models.IntegerField() class another(models.Model):
test_id = models.IntegerField()
test_a_id = models.IntegerField()
class Meta:
app_label = 'another' class dsasdas(models.Model):
test_id = models.IntegerField()
test_a_id = models.IntegerField()
class Meta:
app_label = 'another'
同步数据库要使用的是
python manage.py makemigrations 然后同步default
python manage.py migrate 同步非default
python manage.py migrate --database==default2
这样才会同步完两个数据库
好的,一个app连接多个数据库表演完毕。
ps:我认为应该有其他方式啊。。不应该要通过新建一个没怎么用的空app another来搞,哪路大神知道的话希望能救下小弟。
Django:同一个app支持多个数据库的更多相关文章
- Django 多数据库联用(同一个APP的models里不同class用不同数据库)
很多网站有多数据库联用的文章,如自强学堂http://code.ziqiangxuetang.com/django/django-multi-database.html 大都只讲解如何让不同的app对 ...
- 第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理
第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理 将一个app下的models数据库表注册到xadmin后台管理 重点 ...
- Django之路:模型(数据库)和自定义Field以及数据表的更改
一.Django 模型(数据库) Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库,只需要在s ...
- Django框架的使用教程--mysql数据库[三]
Django的数据库 1.在Django_test下的view.py里面model定义模型 from django.db import models # Create your models here ...
- 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
- Django去操作已经存在的数据库
你有没有遇到过这种情况? 数据库,各种表结构已经创建好了,甚至连数据都有了,此时,我要用Django管理这个数据库,ORM映射怎么办??? Django是最适合所谓的green-field开发,即从头 ...
- 四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
- python 之 Django框架(APP和ORM的使用)
12.3 APP 12.31 创建APP 一个Django项目可以分为很多个APP,用来隔离不同功能模块的代码 用命令行创建一个APP: python3 manage.py startapp app0 ...
- Python中的Django框架中prefetch_related()函数对数据库查询的优化
实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
随机推荐
- 快速安装 Laravel 5.7
$ git clone https://github.com/laravel/laravel.git $ cd laravel $ cp .env.example .env $ composer in ...
- 【题解】Luogu CF817F MEX Queries
原题传送门 817,我突然想到了某8位质数 这题珂以说是珂朵莉树的模板 三个操作都肥肠简单,前两个区间赋值,第三个区间0变1,1变0 每次输出从头开始扫描就行(我忘了珂朵莉树的性质,竟然还动态维护最左 ...
- AHOI2019游记
day0 早上八点钟出发,下午一点左右到了(高速好堵啊) 下午试机,打了一发线段树,堆和其他一些东西,测试完没有问题就走了 惊奇发现旁边竟然是合肥市队的WC银牌hzy,%%% 晚上%了一发金牌爷yg就 ...
- elasticsearch 常用命令
#查看集群状态 curl -XGET "http://localhost:9200/_cluster/health?pretty" #查看所有的快照 curl -XGET &quo ...
- 物理层PHY 和 网络层MAC
PHY模块简介 物理层位于OSI最底层,物理层协议定义电气信号.线的状态.时钟要求.数据编码和数据传输用的连接器. 物理层的器件称为PHY. 上图里的灰色方框图里的就是PHY芯片内部模块图. MAC器 ...
- mysql基操
创建数据表: create table tt1( id int, name varchar(20), age int,sex boolean ); insert into tt1 values(1,& ...
- 不校验csrf
from django.views.decorators.csrf import csrf_exempt@csrf_exemptdef a(request): pass
- zabbix报警逻辑初探
zabbix报警逻辑初探 首先贴出一张网上找的一张关于zabbix报警相关表结构及表关联逻辑图: actions表 actions表对应前端配置是动作(actions) action由conditio ...
- django 开发笔记1
1.布置到云服务器 使用 python3 manage.py runserver提示错误,需要将settings.py 中 ALLOWED_HOSTS 字典中加入 localhost;0.0.0.0; ...
- Lombok之使用详解
前言 在Java中,封装是一个非常好的机制,最常见的封装莫过于get,set方法了,无论是Intellij idea 还是Eclipse,都提供了快速生成get,set方法的快捷键,使用起来很是方便, ...