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中的作用域规则详解
Jan 30 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
Python实现监控程序执行时间并将其写入日志的方法
Jun 30 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
python生成多个只含0,1元素的随机数组或列表的实例
Nov 12 Python
python DataFrame 取差集实例
Jan 30 Python
Python实现的列表排序、反转操作示例
Mar 13 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
python 随机森林算法及其优化详解
Jul 11 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
pytorch标签转onehot形式实例
Jan 02 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更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP递归创建多级目录
2015/11/05 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
2015/12/25 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
简单介绍Python中的JSON使用
2015/04/28 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
Python实现搜索算法的实例代码
2020/01/02 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
pandas分组聚合详解
2020/04/10 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
django在开发中取消外键约束的实现
2020/05/20 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
css3media响应式布局实例
2016/07/08 HTML / CSS
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
行政经理的岗位职责
2013/11/23 职场文书
留学自荐信写作方法
2014/01/27 职场文书
个人函授自我鉴定
2014/03/25 职场文书
三年级评语大全
2014/04/23 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
小学校长个人总结
2015/03/03 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书