我以我个人的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支持多个数据库的更多相关文章

  1. Django 多数据库联用(同一个APP的models里不同class用不同数据库)

    很多网站有多数据库联用的文章,如自强学堂http://code.ziqiangxuetang.com/django/django-multi-database.html 大都只讲解如何让不同的app对 ...

  2. 第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理

    第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理 将一个app下的models数据库表注册到xadmin后台管理 重点 ...

  3. Django之路:模型(数据库)和自定义Field以及数据表的更改

    一.Django 模型(数据库) Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库,只需要在s ...

  4. Django框架的使用教程--mysql数据库[三]

    Django的数据库 1.在Django_test下的view.py里面model定义模型 from django.db import models # Create your models here ...

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

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

  6. Django去操作已经存在的数据库

    你有没有遇到过这种情况? 数据库,各种表结构已经创建好了,甚至连数据都有了,此时,我要用Django管理这个数据库,ORM映射怎么办??? Django是最适合所谓的green-field开发,即从头 ...

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

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

  8. python 之 Django框架(APP和ORM的使用)

    12.3 APP 12.31 创建APP 一个Django项目可以分为很多个APP,用来隔离不同功能模块的代码 用命令行创建一个APP: python3 manage.py startapp app0 ...

  9. Python中的Django框架中prefetch_related()函数对数据库查询的优化

    实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

随机推荐

  1. class的真相

    Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...

  2. Java基础学习-标识符

    1.标识符的作用     -给包.类.方法.变量等起名字 2.组成规则     -这里的字符采用的是Unicode字符集,所以包括英文大小写字母,中文字符,数字字符等.不建议使用汉字.     -下划 ...

  3. win10 WSL kali 下载源 --另外 恭喜马哥喜提博客

    第一篇也不知道写什么,就把昨晚安装kali时遇见的事写一下吧! 因为win10应用商店已经加入了kali,也省的我再去网上下载镜像,可下载后  wsl  未能设置为开发人员模式, 这算是失误吧!步骤如 ...

  4. Qt Designer问题(挖坑)

    同时用两个VS的Qt Designer打开.ui文件,关闭Qt Designer之后再打开发现Qt Designer不在打开方式了.要重启VS才行.

  5. ComponentOne 2019V1:全面支持 Visual Studio 2019

    ComponentOne Enterprise 2019V1已经正式发布,本次更新的最大亮点就是 ComponentOne 控件全面支持 Visual Studio 2019. 作为一款专注于企业应用 ...

  6. 【GO】【LiteIDE】

    https://blog.csdn.net/qq_32034593/article/details/82986311 下载地址:https://www.golangtc.com/download/li ...

  7. 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)

    项目中需要搜索, 所以从零开始学习大家都在用的搜索神器 elasiticsearch. 刚开始 google 的时候, 搜到好多经验贴和视频(中文的, 英文的), 但是由于是第一次接触, 一点概念都没 ...

  8. Subversion ----> svnserve.conf / authz / passwd / hooks-env.tmpl <<翻译笔记>>

    svnserve.conf 假如你使用这个文件去允许访问这个仓库,那么这个文件控制着svnserve后台进程的配置.(但是如果你只是允许通过http和/或者 file:URLs,则这个文件就不起作用了 ...

  9. 解决JS中取URL地址中的参数中文乱码

    GET请求会将中文编码,如果取出乱码的话,应该进行解码操作, 下面的函数是获取指定参数名的参数值,参数值可是中文.英文. function getQueryString(name) { var reg ...

  10. LeetCode--032--最长有效括号(java)

    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()&quo ...