首发于 python与django的应用

django中如何使用多个数据库(一)

前言

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

1、前期准备

首先要确保多个app都已经在settings.py文件中的INSTALLED_APPS里注册了,否则会出现问题。

本次示例目录如下:

2、创建模型

app01中的models文件内容如下:

# -*- coding: utf-8 -*-
from django.db import models
# Create your models here.
class People(models.Model):
      name = models.CharField(verbose_name=u'姓名', db_index=True)
      age = models.SmallIntegerField(max_length=20, verbose_name=u'年龄')

app02中的models文件内容如下:

# -*- coding: utf-8 -*-
from django.db import models
# Create your models here.
class Department(models.Model):
    name = models.CharField(verbose_name=u'部门名称', db_column='department_name')

3、数据库配置

接下来开始配置数据库,在 django的settings.py文件 使用DATABASES 设置定义数据库,这个设置用于映射数据库别名和特定的连接设置字典,这是 Django 定义数据库一贯的手法;DATABASES定义的是要给嵌套字典,该设置必须配置default默认数据库。默认使用SQLite进行单一数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'database',
}

当然了,我们如果不想使用默认数据库的话,可以将默认配置为空字典形式,但就是不能删除它:

DATABASES = {
    'default': {}
}

既然要使用多个数据库,那么就需要我们自己来配置了:

DATABASES = {
    'default': {},
    'department': {
        u'ENGINE': 'django.db.backends.mysql',  # 默认用mysql
        u'NAME': 'department',  # 数据库名
        u'USER': 'root',  # 你的数据库user
        u'PASSWORD': 'mysql',  # 你的数据库password
        u'HOST': '127.0.0.1',  # 开发的时候,使用localhost
        u'PORT': '3306',  # 默认3306
    'people': {
        u'ENGINE': 'django.db.backends.mysql',  # 默认用mysql
        u'NAME': 'people',  # 数据库名
        u'USER': 'root',  # 你的数据库user
        u'PASSWORD': 'mysql',  # 你的数据库password
        u'HOST': '127.0.0.1',  # 开发的时候,使用localhost
        u'PORT': '3306',  # 默认3306
}

4、迁移数据库

当然了,现在就可以进行数据库迁移了,不过要首先确保已经存在department和people这两个数据库,命令如下:

python manage.py makemigrations
python manage.py migrate --database=people
python manage.py migrate --database=department

不能直接使用python manage.py migrate,因为没有指定default数据库,会报错。除非指定了default数据库。

5、查看迁移结果

迁移完成后,就能看到两个数据库中都生成了相应的表。

department和people这两个数据库中的表完全一样。

既然已经有了两个数据库,那么就要用起来才有意义,下面来看看如何使用的:直接使用console控制台进行演示。

from app01.models import People
from app02.models import Department
People.objects.using('people').create(name='xiaoming', age=18)