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批量同步web服务器代码核心程序
Sep 01 Python
Python中给List添加元素的4种方法分享
Nov 28 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
Nov 29 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
python中树与树的表示知识点总结
Sep 14 Python
python 实现将Numpy数组保存为图像
Jan 09 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
tensorflow之自定义神经网络层实例
Feb 07 Python
Python web如何在IIS发布应用过程解析
May 27 Python
Python获取android设备cpu和内存占用情况
Nov 15 Python
python爬虫工具例举说明
Nov 30 Python
Python 中Operator模块的使用
Jan 30 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中的数组操作函数整理
2008/08/18 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
javascript 简练的几个函数
2009/08/29 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
Vee-Validate的使用方法详解
2017/09/22 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
python中实现k-means聚类算法详解
2017/11/11 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
行政人员工作职责
2013/12/05 职场文书
教师教学评估方案
2014/05/09 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
师范生见习报告
2014/10/31 职场文书
首都博物馆观后感
2015/06/05 职场文书
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
详解Python flask的前后端交互
2022/03/31 Python
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python