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 Mysql自动备份脚本
Jul 14 Python
centos下更新Python版本的步骤
Feb 12 Python
python开启多个子进程并行运行的方法
Apr 18 Python
Python使用爬虫猜密码
Feb 19 Python
python实现对输入的密文加密
Mar 20 Python
在SQLite-Python中实现返回、查询中文字段的方法
Jul 17 Python
Python对wav文件的重采样实例
Feb 25 Python
Python如何实现机器人聊天
Sep 10 Python
小结Python的反射机制
Sep 28 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
python实现求纯色彩图像的边框
Apr 08 Python
python小程序之飘落的银杏
Apr 17 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
中东人咖啡哲学
2021/03/03 咖啡文化
隐性调用php程序的方法
2009/03/09 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
试用期员工考核制度
2014/01/22 职场文书
自立自强的名人事例
2014/02/10 职场文书
出纳试用期自我鉴定
2014/04/07 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
质量承诺书格式范文
2015/04/28 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书