django 多数据库配置教程


Posted in Python onMay 30, 2018

在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。

1. 修改项目的 settings 配置

在 settings.py 中配置需要连接的多个数据库连接串

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'sqlite3'),
  },
  'db01': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db_01'),
  },
  'db02': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db_02'),
  },
}

假设现在我们用到3个数据库,一个default默认库,一个 db01 和 db02

2. 设置数据库的路由规则方法

在 settings.py 中配置 DATABASE_ROUTERS

DATABASE_ROUTERS = ['Prject.database_router.DatabaseAppsRouter']

Project: 建立的django项目名称(project_name)

database_router: 定义路由规则database_router.py 文件名称, 这个文件名可以自己定义

DatabaseAppsRouter: 路由规则的类名称,这个类是在database_router.py 文件中定义

3. 设置APP对应的数据库路由表

每个APP要连接哪个数据库,需要在做匹配设置,在 settings.py 文件中做如下配置:

DATABASE_APPS_MAPPING = {
  # example:
  # 'app_name':'database_name',
  'app02': 'db02',
  'app01': 'db01',
  'admin': 'db01',
  'auth': 'db01',
  'contenttypes': 'db01',
  'sessions': 'db01',
}

以上的app01, app02是项目中的 APP名,分别指定到 db01, db02 的数据库。

为了使django自己的表也创建到你自己定义的数据库中,你可以指定 : admin, auth, contenttypes, sessions 到设定的数据库中,如果不指定则会自动创建到默认(default)的数据库中

4. 创建数据库路由规则

在项目工程根路径下(与 settings.py 文件一级)创建 database_router.py 文件:

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
  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
  def allow_migrate(self, db, app_label, model=None, **hints):
    """
    Make sure the auth app only appears in the 'auth_db'
    database.
    """
    if db in DATABASE_MAPPING.values():
      return DATABASE_MAPPING.get(app_label) == db
    elif app_label in DATABASE_MAPPING:
      return False
    return None

5. Models创建样例

在各自的 APP 中创建数据表的models时,必须要指定表的 app_label 名字,如果不指定则会创建到 default 中配置的数据库名下,

如下:

在app01下创建models

class Users(models.Model):
  name = models.CharField(max_length=50)
  passwd = models.CharField(max_length=100)
  def __str__(self):
    return "app01 %s " % self.name
  class Meta:
    app_label = "app01"

在app02下创建models

class Users(models.Model):
  username = models.CharField(max_length=100)
  password = models.CharField(max_length=50)
  age = models.IntegerField()
  def __str__(self):
    return "app02 %s" % self.username
  class Meta:
    app_label = "app02"
class Book(models.Model):
  user = models.ForeignKey("Users", on_delete=models.CASCADE)
  bookname = models.CharField(max_length=100)
  def __str__(self):
    return "%s: %s" % (self.user.username, self.bookname)
  class Meta:
    app_label = "app02"

在 app03创建models 未指定 app_label,创建到default下

class Users(models.Model):  
  username = models.CharField(max_length=100)

6. 生成数据表

在使用django的 migrate 创建生成表的时候,需要加上 ?database 参数,如果不加则将 未 指定 app_label 的 APP的models中的表创建到default指定的数据库中,如:

将app01下models中的表创建到db01的数据库”db_01”中

./ manage.py migrate --database=db01

将app02下models中的表创建到db02的数据库”db_02”中

./ manage.py migrate --database=db02

将app03下models中的表创建到default的数据库”sqlite3”中

./ manage.py migrate

以上创建完成后,其它所有的创建、查询、删除等操作就和普通一样操作就可以了,无需再使用类似

models.User.objects.using(dbname).all()

这样的方式来操作。

以上这篇django 多数据库配置教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django 多语言教程的实现(i18n)
Jul 07 Python
python 运用Django 开发后台接口的实例
Dec 11 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
使用Python正则表达式操作文本数据的方法
May 14 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
Apache部署Django项目图文详解
Jul 30 Python
Django对models里的objects的使用详解
Aug 17 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
python regex库实例用法总结
Jan 03 Python
python实现超市扫码仪计费
May 30 #Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 #Python
多个应用共存的Django配置方法
May 30 #Python
python实现支付宝当面付(扫码支付)功能
May 30 #Python
详解Python3.6安装psutil模块和功能简介
May 30 #Python
python3之模块psutil系统性能信息使用
May 30 #Python
python批量导入数据进Elasticsearch的实例
May 30 #Python
You might like
php抓即时股票信息
2006/10/09 PHP
PHP实现图片简单上传
2006/10/09 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
picChange 图片切换特效的函数代码
2010/05/06 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
Python实现备份文件实例
2014/09/16 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
利用python画出折线图
2018/07/26 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
意大利男装网店:Vrients
2019/05/02 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
Java程序员综合测试题
2014/04/25 面试题
《果园机器人》教学反思
2014/04/13 职场文书
分公司负责人任命书
2014/06/04 职场文书
公司感谢信范文
2015/01/22 职场文书
给上级领导的感谢信
2015/01/22 职场文书
幸福终点站观后感
2015/06/04 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书