django 多数据库配置

在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‘),
    },
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

2. 设置数据库的路由规则方法 
在 settings.py 中配置 DATABASE_ROUTERS

 DATABASE_ROUTERS = [‘Prject.database_router.DatabaseAppsRouter‘]
  • 1

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‘,
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

以上的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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

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

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

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

./ manage.py  migrate  --database=db01                                
  • 1

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

./ manage.py  migrate  --database=db02
  • 1

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

./ manage.py  migrate
  • 1

以上创建完成后,其它所有的创建、查询、删除等操作就和普通一样操作就可以了,无需再使用类似 
models.User.objects.using(dbname).all() 
这样的方式来操作

原文地址:https://www.cnblogs.com/ExMan/p/9451010.html

时间: 2024-11-08 13:01:23

django 多数据库配置的相关文章

Django models数据库配置以及多数据库联用设置

今天来说说web框架Django怎么配置使用数据库,也就是传说中MVC(Model View Controller)中的M,Model(模型). 简单介绍一下Django中的MVC: 模型(model):定义你的数据库,一般都在models.py文件中. 视图(view):定义你的HTML等静态网页文件相关,也就是那些html.css.js等前端的东西. 控制器(controller):定义你的业务逻辑相关,就是你的主要代码. 正文开始 首先要在你的Django项目中找到两个文件:setting

Django 笔记 数据库配置

在pycharm 配置数据源 前提是你要有mysql 输入数据库和用户名密码 看下测试连接 然后就可以写SQL查询语句了 先创建一个mysite的项目,并且创建一个books的app 会一波把模型和视图创建出来 先定义首页index和query2个页面 在定义首页和查询的2个程序 首页正常 Query 有递归错误

django下数据库配置

1.django默认支持sqlite.mysql.Oracle.postgresql数据库,像db2和sqlserver之类的数据库之类的数据库支持需要第三方的支持.具体详见:https://docs.djangoproject.com/en/1.9/ref/databases/ Using a 3rd-party database backend? In addition to the officially supported databases, there are backends pro

Django ORM 数据库设置和读写分离

一.Django的数据库配置 (一)修改settings.py文件关于数据库的配置: Django默认使用sqlite: # Django默认的数据库库,SQLit配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # sqlite引擎 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } 再添加一个数据库:仿照"default"的格式直接添加: DAT

python django 站点管理 配置mysql数据库

运行命令mysql -uroot -p进入mysql 新建一个数据库mydatabase 在/mysite/mysite目录下 编辑settings.py文件: 默认数据库为sqlite: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'mydatabase', } } mysql数据库配置: DATABASES = { 'default': { 'ENGINE': 'django.db.ba

Django数据库配置

将Django使用数据库由默认的sqlite3更改为mysql: 1.安装mysql驱动程序 MySQLdb(mysql-python) mysqlclient Connector/Python PyMySQL(纯python的mysql驱动) 2.在配置文件settings.py中,修改DATABASES项 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'my_blog', 'USER': 'r

Linux下安装Python3的django并配置mysql作为django默认数据库(转载)

我的操作系统为centos6.5 1  首先选择django要使用什么数据库.django1.10默认数据库为sqlite3,本人想使用mysql数据库,但为了测试方便顺便要安装一下sqlite开发包. yum install mysql mysql-devel #为了测试方便,我们需要安装sqlite-devel包 yum install sqlite-devel 2  接下来需要安装Python了,因为Python3已经成为主流,所以接下来我们要安装Python3,到官网去下载Python3

django之创建第8个项目-数据库配置及同步研究

1.sqlitestudio-2.1.5数据库可视化工具--百度云盘下载 2.编写C:\djangoweb\helloworld\blog\models.py文件 # Create your models here. #coding:utf-8 from django.db import models class Student(models.Model): name=models.CharField(max_length=50) age=models.IntegerField() 3.配置C:

Django Setting文件配置和简单的创建数据库字段

Django Settings文件配置 静态文件配置 STATIC_URL = '/static/' # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] # 暴露给外界能够访问服务器静态文件夹下面所有的资源 STATIC_URL = '/xxx/' # 接口前缀 跟你的静态文件夹的名字一点关系都没有 # 默认情况下这个前缀跟静态文件夹名字一样!!! # 静态文件配置 STATICFILES_DIRS = [ os.pat