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‘: ‘123456789‘,
        ‘HOST‘:‘192.168.1.1‘,
        ‘PORT‘:‘3306‘,
    },
    ‘hvdb‘:{   #配置第二个数据库节点名称
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘: ‘testdjango‘, #第二个数据库的名称
        ‘USER‘: ‘root‘,
        ‘PASSWORD‘: ‘123456789‘,
        ‘HOST‘:‘192.168.1.1‘,
        ‘PORT‘:‘3306‘,
    }
}

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
            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模型

时间: 2024-12-21 21:18:25

django配置连接多个数据库,自定义表名称的相关文章

C#-关于带参数的单例模式的思考(利用带参数的单例模式连接并查询数据库特定表的信息)

首先,让我们看一下单例模式是怎样的. public sealed class Singleton { private static Singleton instance = null; private static readonly object padlock = new object(); Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (

Django初体验(一):自定义表单提交

注:本人使用的Django1.8.3版本进行测试 除了使用Django内置表单,有时往往我们需要自定义表单.对于自定义表单Post方式提交往往会带来由CSRF(跨站请求伪造)产生的错误"CSRF verification failed. Request aborted." 本篇博客只要针对"表单提交"和"Ajax提交"两种方式来解决CSRF带来的错误 一.表单提交 Template: <!DOCTYPE html> <html

SQL server 数据库用户表名称

转自(http://blog.163.com/jlj_sk/blog/static/22579293200861422833924/) 取得SQL server 数据库中 所有用户表名称 select name from sysobjects where xtype='U' order by name SQL server数据库系统表详解: sysaltfiles 主数据库 保存数据库的文件 syscharsets 主数据库字符集与排序顺序 sysconfigures主数据库 配置选项 sysc

ODAC连接远程Oracle数据库时,数据源名称orcl改为gscloud

今天用ODAC连接远程Oracle数据库时,怎么也连接不上, 更改配置文件的tnsname.ora,使之都一样,并完全配置正确还是出现错误,连接不上. 最后请大神一世,原来是数据源名称的问题. 把数据源名称orcl改为gscloud就可以了. ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 223.223.179.17)(PORT = 1521)) ) (CONNECT_DATA = (SERVIC

Django 自定义表名和字段名

通过db_table和db_column自定义数据表名和字段名 假如你的数据库里已经有了一张数据表,且该表包含多个字段,你希望通过Django直接访问该数据表的各个字段而不是重新建立新表,你这时可以通过db_table指定数据表名,还可以通过db_column指定希望访问的字段名. 在我们创建一个模型时,Django的ORM会根据应用名(app name), 模型名(model name)和字段名(field name)自动在数据库中创建数据表.比如我们有一个Blog的应用,里面有Article

activiti自定义流程之自定义表单(二):创建表单

注:环境配置:activiti自定义流程之自定义表单(一):环境配置 在上一节自定义表单环境搭建好以后,我就正式开始尝试自己创建表单,在后台的处理就比较常规,主要是针对ueditor插件的功能在前端进行修改. 由于自己的前端相关技术太渣,因此好多东西都不会用,导致修改实现的过程也是破费了一番功夫,头皮发麻了好几天. 既然是用别人的插件进行修改,那么我想如果只是单独的贴出我修改后的代码,可能没有前后进行对比好理解,因此这里就把原代码和修改后的同时对比着贴出,以便于朋友们能从对比中更快的得到启发.

macOS下Django配置mysql,无法安装mysqlclient的问题

最近跟着学校与企业合作的课程学习了Django,再一次理解MVC,真是感慨良多,打算先记录一些问题,至于整个学习过程的记录这个坑等毕业论文搞掂后慢慢填上. 上课老师使用的环境是win32的python3.6.x和Django 2.x.我个人的环境是macOS High Sierra的python3.4.3和Django 2.x.DBMS使用mysql,配置数据库的时候遇到一些问题.主要的是无法安装mysqlclient这个py第三方库.开发环境都使用vscode. 从Django数据库配置过程说

nginx+uwsgi+django 配置3

在uwsgi和django配置连接成功后,开始部署正式的业务. uwsgi.xml  和 manage.py  在同一个目录下 supervisor pip install  supervisor  安装supervisor echo_supervisord_conf > /路径supervisord.conf supervisord  开启 先弄懂两个命令: supervisord : supervisor的服务器端部分,启动supervisor就是运行这个命令 supervisorctl:启

nagios监控oralce数据库的表空间大小

一.安装nrpe 本处使用直接解压的方式来安装的nrpe 二.配置nrpe服务 1.修改libexec文件夹中的check_oracle 在其中添加如下项 ORACLE_HOME=/oradata/Oracle/product/11.2.0 PATH=$PATH:/oradata/Oracle/product/11.2.0/bin 2.在nrpe.conf中添加如下项 command[check_oracle_tablespace]=/usr/local/nagios/libexec/check