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的Twisted框架中Deferred对象的用法
May 25 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
对python中的iter()函数与next()函数详解
Oct 18 Python
Python 实现文件打包、上传与校验的方法
Feb 13 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
对python中assert、isinstance的用法详解
Nov 27 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
python绘制动态曲线教程
Feb 24 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
用 python 进行微信好友信息分析
Nov 28 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
1.PHP简介
2006/10/09 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
PHP可变函数学习小结
2015/11/29 PHP
PHP自定义错误用法示例
2016/09/28 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
php-fpm服务启动脚本的方法
2018/04/27 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
javascript 面向对象的JavaScript类
2010/05/04 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
wxPython学习之主框架实例
2014/09/28 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
在django中,关于session的通用设置方法
2019/08/06 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
什么是类的返射机制
2016/02/06 面试题
实习协议书范本
2014/04/22 职场文书
初二学生评语大全
2014/12/26 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers