django配置连接多个数据库,自定义表名称
在项目tt下新建两个app,分别为app01、app02。配置app01使用default节点数据库;app02使用hvdb节点数据库(也可以配置app01下的model既使用default,也可以使用hvdb数据库)
1.编辑settings.py,添加多个数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testly',
'USER': 'root',
'PASSWORD': '',
'HOST':'192.168.1.1',
'PORT':'',
},
'hvdb':{ #配置第二个数据库节点名称
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testdjango', #第二个数据库的名称
'USER': 'root',
'PASSWORD': '',
'HOST':'192.168.1.1',
'PORT':'',
}
}
Django 要求default 数据库必须定义,但是如果不会用到,其参数字典可以保留为空。若要这样做,你必须为你的所有的应用的模型建立DATABASE_ROUTERS,包括正在使用的contrib 中的应用和第三方应用。
default留空写法:
'default': {},
2.添加数据库路由表
在tt目录下新建文件db_router.py,内如如下。该文件用来对数据库进行自动路由,可以根据每个model的app_label来指定使用某个DB。
注:可以定义多个Router,由于此处的app01使用default数据库,所以在此无需指定default节点的数据库路由。
# -*- coding: UTF-8 -*-
class app02Router(object): #配置app02的路由,去连接hvdb数据库
"""
A router to control all database operations on models in the app02 application.
"""
def db_for_read(self, model, **hints):
"""
Attempts to read app02 models go to hvdb DB.
"""
if model._meta.app_label == 'app02': #app name(如果该app不存在,则无法同步成功)
return 'hvdb' #hvdb为settings中配置的database节点名称,并非db name。dbname为testdjango
return None def db_for_write(self, model, **hints):
"""
Attempts to write app02 models go to hvdb DB.
"""
if model._meta.app_label == 'app02':
return 'hvdb'
return None def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the app02 app is involved.
当 obj1 和 obj2 之间允许有关系时返回 True ,不允许时返回 False ,或者没有 意见时返回 None 。
"""
if obj1._meta.app_label == 'app02' or \
obj2._meta.app_label == 'app02':
return True
return None def allow_migrate(self, db, model):
"""
Make sure the app02 app only appears in the hvdb database.
"""
if db == 'hvdb':
return model._meta.app_label == 'app02'
elif model._meta.app_label == 'app02':
return False def allow_syncdb(self, db, model): #决定 model 是否可以和 db 为别名的数据库同步
if db == 'hvdb' or model._meta.app_label == "app02":
return False # we're not using syncdb on our hvdb database
else: # but all other models/databases are fine
return True
return None # class app01Router(object):
# """
# A router to control all database operations on models in the
# aew application.
# """
# def db_for_read(self, model, **hints):
# """
# Attempts to read aew models go to aew DB.
# """
# if model._meta.app_label == 'app01':
# return 'default'
# return None # def db_for_write(self, model, **hints):
# """
# Attempts to write aew models go to aew DB.
# """
# if model._meta.app_label == 'app01':
# return 'default'
# return None # def allow_relation(self, obj1, obj2, **hints):
# """
# Allow relations if a model in the aew app is involved.
# """
# if obj1._meta.app_label == 'app01' or obj2._meta.app_label == 'app01':
# return True
# return None # def allow_migrate(self, db, model):
# """
# Make sure the aew app only appears in the aew database.
# """
# if db == 'default':
# return model._meta.app_label == 'app01'
# elif model._meta.app_label == 'app01':
# return False
# return None
3.编辑settings.py,添加路由:
注:由于此处的app01使用default数据库,所以在此无需指定default节点的数据库路由。
DATABASE_ROUTERS = ['tt.db_router.app02Router'] #tt为当前项目名称,db_router为上一步编写的db_router.py文件,app02Router为Router
#DATABASE_ROUTERS = ['tt.db_router.app02Router','tt.db_router.app01Router'] #如果定义了多个Router,在此就需要分别指定。注意:这个是有顺序的(先匹配上的规则,就先生效)
4.为每个app的model分别指定所需要连接的数据库:
通过对每个model指定好对应的app_label,使其通过Router去连接相应的数据库。
编辑app02下的models.py,为app02下的model mtable01指定连接hvdb节点数据库,内容如下:
class mtable01(models.Model):
name=models.CharField(max_length=100,primary_key=True,unique=True)
ip=models.GenericIPAddressField()
rating = models.IntegerField() def __str__(self):
return self.name class Meta:
app_label = 'app02' #定义该model的app_label
ordering = ['name'] 使用migrate命令同步数据库:
编辑app01下的models.py:
class tb05(models.Model): #该model使用default数据库
name=models.CharField(max_length=100,primary_key=True,unique=True)
ip=models.GenericIPAddressField()
rating = models.IntegerField() def __str__(self):
return self.name class Meta:
#app_label = 'app01' #由于该model连接default数据库,所以在此无需指定
ordering = ['name']
也可以为app01下的model指定连接hvdb数据库,内容如下:
class tb2(models.Model):
name=models.CharField(max_length=100,primary_key=True,unique=True)
ip=models.GenericIPAddressField()
rating = models.IntegerField() def __str__(self):
return self.name class Meta:
app_label = 'app02'
ordering = ['name']
为app01下的tb02指定使用hvdb数据库,同时自定义表名称为‘mytable’,不使用默认的表名称app02_tb06,不便于区分
class tb06(models.Model):
name=models.CharField(max_length=100,primary_key=True,unique=True,db_column='mycname') #使用db_column自定义字段名称
ip=models.GenericIPAddressField()
rating = models.IntegerField() def __str__(self):
return self.name class Meta:
db_table = 'mytable' #自定义表名称为mytable
verbose_name = '自定义名称' #指定在admin管理界面中显示的名称
app_label = 'app02'
ordering = ['name']
5.同步数据库:
migrate管理命令一次操作一个数据库。默认情况下,它在default 数据库上操作,但是通过提供一个 --database 参数,告诉migrate同步一个不同的数据库。
1)同步default节点数据库,只运行不带 --database参数的命令,不对其他数据库进行同步
python manage.pymigrate
python manage.py makemigrations
python manage.pymigrate
2)同步hvdb节点数据库:
python manage.pymigrate --database=hvdb
python manage.py makemigrations
python manage.pymigrate --database=hvdb
结果:
testdjango数据库(hvdb节点)下的app02_mtable01表对应app02下的mtable01模型
testdjango数据库(hvdb节点)下的app02_tb2表对应app01下的tb2模型
testly数据库(default节点)下的app01_tb05表对应app01下的tb05模型

参考:http://smilejay.com/2014/07/django-use-mult-databases/ 根据model的app label区分数据库
http://my.oschina.net/u/572994/blog/108533 根据应用自动区分数据库
http://python.usyiyi.cn/django/topics/db/multi-db.html Django文档
django配置连接多个数据库,自定义表名称的更多相关文章
- Django之连接多个数据库的相关配置
01-修改django默认的数据库 # settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NA ...
- [置顶] 自己写代码生成器之生成Dal层代码(获取数据库所有表名称)
自己写代码生成器之生成Dal层代码(获取数据库所有表名称) --得到数据库birthday所有表名称 select name from sysobjects where [type]='U' --se ...
- Django初体验(一):自定义表单提交
注:本人使用的Django1.8.3版本进行测试 除了使用Django内置表单,有时往往我们需要自定义表单.对于自定义表单Post方式提交往往会带来由CSRF(跨站请求伪造)产生的错误"CS ...
- Springboot配置连接两个数据库
背景: 项目中需要从两个不同的数据库查询数据,之前实现方法是:springboot配置连接一个数据源,另一个使用jdbc代码连接. 为了改进,现在使用SpringBoot配置连接两个数据源 实现效果: ...
- sqldbx配置连接Oracle 12C数据库
本地开发环境: Windows10 64位.Oracle 12C客户端 32位.sqlDBX (32位) =============================================== ...
- SQL server 数据库用户表名称
转自(http://blog.163.com/jlj_sk/blog/static/22579293200861422833924/) 取得SQL server 数据库中 所有用户表名称 select ...
- ODAC连接远程Oracle数据库时,数据源名称orcl改为gscloud
今天用ODAC连接远程Oracle数据库时,怎么也连接不上, 更改配置文件的tnsname.ora,使之都一样,并完全配置正确还是出现错误,连接不上. 最后请大神一世,原来是数据源名称的问题. 把数据 ...
- Django项目连接多个数据库配置
1.设置数据库连接 pip install PyMySQL 2.在项目同名目录myproject/myproject下的__init__.py添加以下代码 import pymysql pymysql ...
- Django之连接远程mysql数据库
1.创建Django项目(test) 进入配置文件settings.py 192.168.83.129:所需要远程连接数据库的ip地址 2.进入到远程连接的主机,修改/etc/mysql/mysql. ...
随机推荐
- zk使用原理
ZooKeeper的基本原理 ZNode的基本概念 ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode.每个ZNode都可以通过其路径唯一标识 ...
- mac 上安装 redis
1.从http://redis.io 下载redis包,这里选择了redis-3.2.3 2.将下载的 redis-3.2.3.tar.gz 包拷贝到 /usr/local 目录 3.执行 sudo ...
- import.html 页面导出execl
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- nginx 学习笔记(6) nginx配置文件中的度量单位
容量大小可以用比特(byte),千比特(kilobyte,后缀k或者K)或者兆(megabytes,后缀m或者M),例如:“1024”,“8k”,“1m”. 时间间隔可以用毫秒(millisecond ...
- java 实现 PDF 加水印功能
使用java代码实现给PDF加水印的功能 首先导入所需要的依赖 <dependency> <groupId>com.itextpdf</groupId> <a ...
- 域名(Domain Name)
是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置,地理上的域名,指代有行政自主权的一个地方区域). 域名是一个IP地址 ...
- BG.VM--CentOS
1. CentOS 更改IP 局域网配置: 在虚拟机的[网络]连接方式中选择:仅主机(Host-Only)网络. 路径:vim /etc/sysconfig/network-scripts/ifcfg ...
- C#比较两个字符串的相似度【转】
原文地址:http://www.2cto.com/kf/201202/121170.html 我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能. ...
- MySQL6:视图
什么是视图 数据库中的视图是一个虚拟表.视图是从一个或者多个表中导出的表,视图的行为与表非常相似,在视图中用户可以使用SELECT语句查询数据,以及使用INSERT.UPDATE和DELETE修改记录 ...
- The request sent by the client was syntactically incorrect.
HTTP Status 400 - type Status report message description The request sent by the client was syntacti ...