一、定义数据库

使用Django的多个数据库的第一步是告诉Django将使用的数据库服务器。 这是使用DATABASES设置完成的。 此设置将数据库别名映射到该特定连接的设置字典,该数据库别名是一种在整个Django中引用特定数据库的方法。 内部词典中的设置在DATABASES文档中有完整描述。

数据库可以包含您选择的任何别名。 当没有选择其他数据库时,Django使用具有默认别名default的数据库。

需求分析:

  • 在进行django项目开发的时候,遇到了需要连接两个MySQL数据库的问题。同时使用django自带的admin进行后台数据管理。针对django项目中有多个app,app之间使用不同数据库的需求。

下面是 settings.py 中的DATABASES配置:

DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3', #没有指定使用数据库的话就是使用default中的数据库
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'db_a': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'student',
'USER': 'root',
'PASSWORD': '123',
"HOST": "localhost",
"PORT": '3306',
},
'db_b': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'teacher',
'USER': 'root',
'PASSWORD': '123',
"HOST": "localhost",
"PORT": '3306',
},

其中default可以为空,但是不能删除,db_a, db_b是需要配置的数据库连接信息。

二、设置路由,将app映射到相对应的数据库

创建一个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

  

三、在settings.py中添加路由:

# 数据库路由
DATABASE_ROUTERS = ['project_name.database_router.DatabaseAppsRouter'] # 路径 # 根据app名称路由指定的数据库
DATABASE_APPS_MAPPING = {
'app01': 'db_a',
'app02': 'db_b',
}

四、为每个app的model分别指定所需要连接的数据库

class UserProfile(models.Model):
username=models.CharField(max_length=32)
password=models.CharField(max_length=64) def __str__(self):
return self.name class Meta:
app_label = 'app01' #定义该model的app_label

此时实现了不同app 使用对应的数据库了, 当然也可以多个sqlite3和MySQL一起使用,甚至可以为每个app单独设置一个数据库。不设置或者没有设置的app会使用默认的数据库。

之后模型修改迁移的时候可以通过--database指定迁移使用的数据库

python manage.py makemigrations
python manage.py migrate --database=db_a

需求二:

  • 对于一个app里想要使用不同数据库进行查询增删等,可以通过指定数据库的方式进行,使用using()方法。

如:

task = User.objects.using('db_a').filter(userId = 1)[0]
 

使用Django中的admin操作指定的数据库

在admin.py中通过下述代码告诉django在处理这些model的orm关系时,使用settings里配置的哪个数据库进行连接。然后再与正常一样进行使用。

class MultiDBModelAdmin(admin.ModelAdmin):
# A handy constant for the name of the alternate database.
using = 'db_a' #指定使用的数据库 def save_model(self, request, obj, form, change):
# Tell Django to save objects to the 'other' database.
obj.save(using=self.using) def delete_model(self, request, obj):
# Tell Django to delete objects from the 'other' database
obj.delete(using=self.using) def get_queryset(self, request):
# Tell Django to look for objects on the 'other' database.
return super(MultiDBModelAdmin, self).get_queryset(request).using(self.using) def formfield_for_foreignkey(self, db_field, request, **kwargs):
# Tell Django to populate ForeignKey widgets using a query
# on the 'other' database.
return super(MultiDBModelAdmin, self).formfield_for_foreignkey(db_field, request, using=self.using, **kwargs) def formfield_for_manytomany(self, db_field, request, **kwargs):
# Tell Django to populate ManyToMany widgets using a query
# on the 'other' database.
return super(MultiDBModelAdmin, self).formfield_for_manytomany(db_field, request, using=self.using, **kwargs) class UserProfileAdmin(MultiDBModelAdmin):
model = CraCrawl admin.site.register(UserProfile, UserProfileAdmin) #注册模型到admin后台管理页面

这样就能在admin中管理指定的数据库了。

参考链接:

Django使用多个数据库的更多相关文章

  1. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  2. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作

    在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接.             产能在软 ...

  3. Django开发笔记之数据库的设计

    后台采用Django开发,可以体会到开发的便利之处,对于一个项目来说,首先最重要的是数据库的设计,那么在Django下数据库设计主要是如下步骤: 1,需求分析,这点子不用多说,而我也深刻体会到了没有原 ...

  4. Django 反向生成 从数据库生成Model

    Django 反向生成 从数据库生成Model 使用Django生成Model python manage.py inspectdb或python manage.py inspectdb > m ...

  5. Scrapy中使用Django的Model访问数据库

    Scrapy中使用Django的Model进行数据库访问 当已存在Django项目的时候,直接引入Django的Model来使用比较简单 # 使用以下语句添加Django项目的目录到path impo ...

  6. Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置

    近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...

  7. Django视图,与数据库交互并返回数据

    环境:python 2.7.13  数据库:sqlite3(Django自带) 在学习Django的时候,遇到了困难.大概就是取到数据库数据后一直不能转成json数据.最后终于自己琢磨解决了. 要点就 ...

  8. Django的ORM实现数据库事务操作

    在Django中实现数据库的事务操作 在学习MySQL数据库时,MySQL数据库是支持原子操作的. 什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费. 交易正常时,银行在消费者 ...

  9. Django开发基础----操作数据库

    Django中对数据库的操作是由Models来完成的 Models是什么? 通常,一个Model对应数据库的一张数据表 Django中Models以类的形式出现 它包含了一些基本字段以及数据的一些行为 ...

  10. (转载)Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置

    近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...

随机推荐

  1. 人工智能-机器学习之numpy方法

    机器学习 最重要的东西就是算法   这里面的水很深  所以呢我就简单的整理了一下 基础的操作     #导入numpy库 as别名 为了怕重名 import numpy as np # 打印版本号 p ...

  2. 文件压缩小项目haffman压缩

    文件压缩的原理: 文件压缩总体可以分为有损压缩和无损压缩两类,有损压缩是指对mp3等格式的文件,忽略一些无关紧要的信息,只保留一些关键的信息,但并不因此影响用户对于这些mp3格式文件的体验度,无损压缩 ...

  3. vue 3D小球 loading

    <template> <div class="load"> <div class="loadEffect"> <spa ...

  4. nodejs&mongo&angularjs

    http://www.ibm.com/developerworks/cn/web/wa-nodejs-polling-app/

  5. windows系统numpy的下载与安装教程

    numpy是一款基于python的功能强大的科学计算包.要安装numpy首先你得先安装python.python的安装非常简单,本人安装的是python3.4. 工具/原料 安装好的python程序 ...

  6. C# 自定义类型通过实现IFormattable接口,来输出指定的格式和语言文化的字符串(例:DateTime)

    常规的调用ToString()方法,存在两个问题. (1).调用者无法控制字符串的格式 (2).调用者不能方便的选择一种特定的语言文化来格式化字符串. 在开发一些国际化的应用时,应用程序需要调用与当前 ...

  7. JAVA面试精选【Java基础第三部分】

    上一篇,我们给出了大概35个题目,都是基础知识,有童鞋反映题目过时了,其实不然,这些是基础中的基础,但是也是必不可少的,面试题目中还是有一些基础题目的,我们本着先易后难的原则,逐渐给出不同级别的题目, ...

  8. Attr类中进行类型推断

    涉及到重要的类的继承关系如下图所示. 关于抛出的异常继承体系:

  9. python使用requests请求的数据乱码

    1.首先进入目标网站,浏览器查看源码,找到head标签下面的meta标签,一般meta标签不止一个,我们只需找到charset属性里面的值即可 2.requests请求成功时,设置它的编码,代码如下 ...

  10. [Python]可变类型,默认参数与学弟的困惑

    一.学弟的困惑 十天前一个夜阑人静.月明星稀的夜晚,我和我的朋友们正在学校东门的小餐馆里吃着方圆3里内最美味的牛蛙,唱着最好听的歌儿,畅聊人生的意义.突然,我的手机一震,气氛瞬间就安静下来,看着牛蛙碗 ...