首页 > 数据库 >django多数据库操作

django多数据库操作

时间:2024-08-04 10:38:52浏览次数:13  
标签:return 数据库 db django 操作 model label app

1. 读写分离

  • 192.168.1.2 default 主数据库负责写入
  • 192.168.1.3 slave 从数据库负责读取

2. 生成数据库表

python manage.py makemigrations
分别迁移到主从数据库
python manage.py migrate --database=default 
python manage.py migrate --database=slave 


多个app分表:分app操作数据库  假设app01对应数据库default,app02对应数据库slave

python manage.py makemigrations
python manage.py migrate app01 --database=default 
python manage.py migrate app02 --database=slave

 

3. 开发时手动选择使用数据库

models.UserInfo.objects.using("default").create(title="admin")
models.UserInfo.objects.using("slave").all()

4. 多数据库,多app操作配置

settings.py中增加数据库配置

DATABASE_ROUTERS = ['KPIBackendSys.database_router.DatabaseAppsRouter']   # 读写文件路径

DATABASE_APPS_MAPPING = {
    'app01': 'default',
    'app02': 'slave',
}

DATABASES = {
    # 默认AI数据库
    'default': {
        'ENGINE': 'mssql',                        # 要连接的 数据库类型
        # 'ENGINE': 'sql_server.pyodbc',          # 要连接的 数据库类型
        'NAME': db1,                # 要连接的 数据库名
        'HOST': host,                      # 要连接的远程数据库的 ip地址
        'PORT': port,                           # 数据库连接端口,mysql默认3306
        'USER': user,                         # 数据库已有用户名
        'PASSWORD': pwd,                   # 数据库已有用户密码
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'MARS_Connection': True,
        },
    },
    'slave': {
        'ENGINE': 'mssql',
        # 'ENGINE': 'sql_server.pyodbc',          # 要连接的 数据库类型
        'NAME': db2,
        'HOST': host,                  # 要连接的远程数据库的 ip地址
        'PORT': port,                       # 数据库连接端口,mysql默认3306
        'USER': user,               # 数据库已有用户名
        'PASSWORD': pwd,                # 数据库已有用户密码
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            # 'MARS_Connection': True,
        },
    },
}

在settings.py同级目录下增加database_router.py文件

database_router.py

class DatabaseAppsRouter(object):
    def db_for_read(self, model, **hints):
        # 判断模型类的元类中的app_label
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None
        # 或直接判断并返回数据库
        if model._meta.app_label == 'app01':
            return default
        if model._meta.app_label == 'app02':
            return slave

    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
        # 或直接判断并返回数据库
        if model._meta.app_label == 'app01':
            return default
        if model._meta.app_label == 'app02':
            return slave

    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

    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

    def allow_migrate(self, db, app_label, model=None, **hints):
        """
        Make sure the auth app only appears in the 'auth_db' database.
        app_label, 表示使用的数据库别名
        """
        if db in DATABASE_MAPPING.values():
            # 允许迁移到auth_db
            return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        # 不允许迁移
        return None

5. 同一个app下的模型存储在不同的数据库

使用database_router.py中的allow_migrate方法, 读写操作同样需要指定数据库

class DatabaseAppsRouter(object):
    def db_for_read(self, model, **hints):
        # 判断模型类的元类中的app_label
        # 或直接判断并返回数据库
        if model._meta.model_name in [model1, model2]:
            return default
        if model._meta.model_name in [model3, model3]:
            return slave

    def db_for_write(self, model, **hints):
        # 或直接判断并返回数据库
        if model._meta.model_name in [model1, model2]:
            return default
        if model._meta.model_name in [model3, model3]:
            return slave

    def allow_migrate(self, db, app_label, model=None, **hints):
        
        if db == 'default':
          if model_name in ['model1', 'model2']:
            return True
          return False
         
        if db == 'slave':
          if model_name in ['model3', 'model4']:
            return True
          return False
        

标签:return,数据库,db,django,操作,model,label,app
From: https://www.cnblogs.com/jackchen28/p/18341512

相关文章

  • 问题记录:解决Linux登录故障,/etc/passwd配置受损该怎么操作
    问题记录:解决Linux登录故障,/etc/passwd配置受损该怎么操作引言在维护Linux系统的过程中,可能会遇到各种紧急情况,其中/etc/passwd文件的损坏是运维人员特别需要准备应对的一种情形。该文件作为Linux用户账户信息的核心存储,一旦遭到破坏,会直接导致用户无法登录,甚至系统服务失......
  • 第6天:信息打点-Web 架构篇&域名&语言&中间件&数据库&系统&源码获取
    #知识点:1、打点-Web架构-语言&中间件&数据库&系统等操作系统:有些漏洞出现的系统不一样、便于知道哪些漏洞可以在目标上攻击Windows&linux开发语言:漏洞的开发语言中间件容器IIS&Apache&Nginx&Tomcat&Weblogic&jboosASP&PHP&Java&python&JavaScript等2、打点-Web源码-......
  • 如何理解先删除缓存还是先修改数据库。
        针对这个问题,其实反过来更好理解,即“先删除缓存还是先修改数据库能保证数据一致”变为“数据不一致的条件是什么”,好,现在就经过第一步转换了,接下来就解决这个问题。    数据不一致其实就是在经过缓存删除和数据库修改变化后缓存中是旧数据,数据库是新数据。更新......
  • Java通过redis实线多线程多用户操作时添加锁
    背景由于项目中多出涉及同步数据,同步过程就是从设备上查询数据,将数据库中该设备数据删除,将新数据导入到数据库;多次同步数据或多用户操作,会导致数据库出现重复数据,例如,两个线程同时删除设备数据,同时导入数据,就会出现双倍数据;还有线程1正在导入数据,中途线程2将线程1导入数据之前删......
  • ORA-07445 opiaba()+639 ORA-00600 17147数据库宕机
    /u01/app/oracle/diag/rdbms/testaa/testaa/traceThuAug0112:43:372024ArchivedLogentry46044addedforthread1sequence23032ID0x860b01b0dest1:ThuAug0112:51:362024Exception[type:SIGSEGV,SI_KERNEL(general_protection)][ADDR:0x0][PC:0x1......
  • 细说文件操作
            你好!感谢支持孔乙己的新作,本文就结构体与大家分析我的思路。希望能大佬们多多纠正及支持!!!个人主页:爱摸鱼的孔乙己-CSDN博客  欢迎互粉哦......
  • Springboot计算机毕业设计便捷线上办公系统(程序+源码+数据库+调试部署)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表员工,职位信息,职称信息,部门信息,员工工资,通知公告开题报告内容一、项目背景随着互联网技术的飞速发展,传统办公模式面临着诸多挑战,如空间限制、效率低下、沟......
  • QT6,数据库批量添加数据方法
    //批量插入数据//odbc风格,预处理语句,其中?相当于占位符query.prepare("insertintostudent(name,age,score)values(?,?,?)");//将字段内容添加到指定list中QVariantListnamelist;namelist<<"zhao"<<"qian"<<"sun&quo......
  • 47 集合操作与运算
    1增加与删除集合元素集合对象的add()方法可以增加新元素,如果该元素已存在则忽略该操作,不会抛出异常;update()方法合并另外一个集合中的元素到当前集合中,并自动去除重复元素。s={1,2,3}print(s)s.add(3)#增加元素,重复元素自动忽略s.update({3,4,5})#更新......
  • 拟南芥表达数据库(包含可变剪切)
    数据来源:Mass-spectrometry-baseddraftofthe Arabidopsis proteome该文章详细检测了拟南芥发育过程中基因及其转录本在不同时间和空间的分布。软件基于python开发,点开即用,用于一键可视化基因的表达第一次搓,有不好的地方欢迎评论区提出来或者联系作者改进 结果如下......