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实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
Python统计单词出现的次数
Apr 04 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
Python实现微信小程序支付功能
Jul 25 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 Python
python3.9.1环境安装的方法(图文)
Feb 02 Python
Python中对象的比较操作==和is区别详析
Feb 12 Python
python3 sqlite3限制条件查询的操作
Apr 07 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 组件化编程技巧
2009/06/06 PHP
PHP下escape解码函数的实现方法
2010/08/08 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
[00:57]深扒TI7聊天轮盘语音出处5
2017/05/11 DOTA
python的id()函数介绍
2013/02/10 Python
python实现的希尔排序算法实例
2015/07/01 Python
python构建基础的爬虫教学
2018/12/23 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
学习Python爬虫的几点建议
2020/08/05 Python
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
美国在线工具商店:Acme Tools
2018/06/26 全球购物
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
应届生会计电算化求职信
2013/10/03 职场文书
小学教师自我鉴定
2013/11/07 职场文书
医院护士的求职信范文
2013/12/26 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
Python如何将list中的string转换为int
2022/07/15 Ruby