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 输出一个两行字符的变量
Feb 05 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
python如何生成各种随机分布图
Aug 27 Python
python实现自动获取IP并发送到邮箱
Dec 26 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
python读写配置文件操作示例
Jul 03 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
python 多线程死锁问题的解决方案
Aug 25 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 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
php下删除字符串中HTML标签的函数
2008/08/27 PHP
PHP 地址栏信息的获取代码
2009/01/07 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
js获得参数的getParameter使用示例
2014/02/26 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
UNIX文件类型
2013/08/29 面试题
高中生学习的自我评价
2013/12/14 职场文书
普罗米修斯教学反思
2014/02/06 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书