Django多数据库联用实现方法解析


Posted in Python onNovember 12, 2020

本文讲述在一个 django project 中使用多个数据库的方法, 多个数据库的联用 以及多数据库时数据导入导出的方法。

直接给出一种简单的方法吧,想了解更多的到官方教程,点击此处

代码

1. 每个app都可以单独设置一个数据库

settings.py中有数据库的相关设置,有一个默认的数据库 default,我们可以再加一些其它的,比如:

# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  },
  'db1': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'dbname1',
    'USER': 'your_db_user_name',
    'PASSWORD': 'yourpassword',
    "HOST": "localhost",
  },
  'db2': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'dbname2',
    'USER': 'your_db_user_name',
    'PASSWORD': 'yourpassword',
    "HOST": "localhost",
  },
}
 
# use multi-database in django
# add by WeizhongTu
DATABASE_ROUTERS = ['project_name.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
  # example:
  #'app_name':'database_name',
  'app1': 'db1',
  'app2': 'db2',
}

在project_name文件夹中存放 database_router.py 文件,内容如下:

# -*- coding: utf-8 -*-
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):
    print db, app_label, model_name, hints
    if db in DATABASE_MAPPING.values():
      return DATABASE_MAPPING.get(app_label) == db
    elif app_label in DATABASE_MAPPING:
      return False
    return None

这样就实现了指定的 app 使用指定的数据库了,当然你也可以多个sqlite3一起使用,相当于可以给每个app都可以单独设置一个数据库!如果不设置或者没有设置的app就会自动使用默认的数据库。

2.使用指定的数据库来执行操作

在查询的语句后面用 using(dbname) 来指定要操作的数据库即可

# 查询
YourModel.objects.using('db1').all()
或者 YourModel.objects.using('db2').all()
# 保存 或 删除
user_obj.save(using='new_users')
user_obj.delete(using='legacy_users')

3.多个数据库联用时数据导入导出

使用的时候和一个数据库的区别是:

如果不是defalut(默认数据库)要在命令后边加 --database=数据库对应的settings.py中的名称 如: --database=db1 或 --database=db2

数据库同步(创建表)

# Django 1.6及以下版本
python manage.py syncdb #同步默认的数据库,和原来的没有区别

# 同步数据库 db1 (注意:不是数据库名是db1,是settings.py中的那个db1,不过你可以使这两个名称相同,容易使用)
python manage.py syncdb --database=db1

# Django 1.7 及以上版本
python manage.py migrate --database=db1

数据导出

python manage.py dumpdata app1 --database=db1 > app1_fixture.json
python manage.py dumpdata app2 --database=db2 > app2_fixture.json
python manage.py dumpdata auth > auth_fixture.json

数据库导入

python manage.py loaddata app1_fixture.json --database=db1
python manage.py loaddata app2_fixture.json --database=db2

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python定时执行之Timer用法示例
May 27 Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
Django实现单用户登录的方法示例
Mar 28 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
python 检测图片是否有马赛克
Dec 01 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 Python
Python中文分词库jieba(结巴分词)详细使用介绍
Apr 07 Python
Python使用Web框架Flask开发项目
Jun 01 Python
Django数据库迁移常见使用方法
Nov 12 #Python
python爬虫中PhantomJS加载页面的实例方法
Nov 12 #Python
python调用win32接口进行截图的示例
Nov 11 #Python
python 下载m3u8视频的示例代码
Nov 11 #Python
pytorch简介
Nov 11 #Python
Python远程linux执行命令实现
Nov 11 #Python
python 实现简单的计算器(gui界面)
Nov 11 #Python
You might like
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
python标准日志模块logging的使用方法
2013/11/01 Python
Python读写unicode文件的方法
2015/07/10 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
linux面试题参考答案(9)
2015/01/07 面试题
PyQt QMainWindow的使用示例
2021/03/24 Python
公司财务工作总结的自我评价
2013/11/23 职场文书
检查接待方案
2014/02/27 职场文书
农林环境专业求职信
2014/03/13 职场文书
高三学生评语大全
2014/04/25 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
邀请书模板
2015/02/02 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
python实现简单反弹球游戏
2021/04/12 Python
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS
聊聊JS ES6中的解构
2021/04/29 Javascript