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中mechanize库的简单使用示例
Jan 10 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
给Python中的MySQLdb模块添加超时功能的教程
May 05 Python
深入理解Python中字典的键的使用
Aug 19 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 Python
Python 控制终端输出文字的实例
Jul 12 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 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
通过html表格发电子邮件
2006/10/09 PHP
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
php预定义常量
2006/12/25 PHP
php empty() 检查一个变量是否为空
2011/11/10 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
php和nginx交互实例讲解
2019/09/24 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
微信跳一跳python代码实现
2018/01/05 Python
使用Python更换外网IP的方法
2018/07/09 Python
Python提取频域特征知识点浅析
2019/03/04 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
家长会主持词
2014/03/26 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python