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的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
django 使用全局搜索功能的实例详解
Jul 18 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
Python range、enumerate和zip函数用法详解
Sep 11 Python
python实现小世界网络生成
Nov 21 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
Python接口测试结果集实现封装比较
May 01 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
python游戏开发之pygame实现接球小游戏
Apr 22 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 session有效期问题
2009/04/26 PHP
php实现的简单日志写入函数
2015/03/31 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
python合并多个excel文件的示例
2020/09/23 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
企划经理的岗位职责
2013/11/17 职场文书
二年级学生评语大全
2014/04/23 职场文书
高二学生评语大全
2014/04/25 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
django中websocket的具体使用
2022/01/22 Python
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js