Django基础之数据库配置

一、配置数据库引擎

Django默认支持的数据库有SQLite、MySQL、Oracle、PostgreSQL数据库,其他的数据库需要第三方的支持。请参照官方文档。

1. Django默认使用的是SQLite3数据库,我们可以通过settings.py中的DATABASES参数进行设置

DATABASES = {
    'default': {

        'ENGINE': 'django.db.backends.mysql',    # 指定数据库引擎,默认的是sqlite3

        'NAME': 'Info',     # 指定数据库名称,已经创建好的数据库。使用其他的数据库引擎时Django不会自动创建数据库

        'USER': 'root',     # 指定数据库用户名

        'PASSWORD': '',     # 指定数据库密码

        'HOST': '',     # 指定数据库主机的IP,留空默认为localhost

        'PORT': '3306',     # 指定数据库端口
    }
}

2. 在apps.py或者初始化文件(__init__.py)中加入:

import pymysql
pymysql.install_as_MySQLdb()

3. 配置完层之后我们还需要安装数据库驱动程序这里我们安装的是pymysql。Python3之前的版本可以安装MySQLdb

pip install pymysql

二、集成已有的数据库表到models中。

1. 根据需要配置好数据库的相关信息。如上操作。

2. 执行python manage.py inspectdb

python manage.py inspectdb > api/models.py  
# 将生成的结果重定向到models.py中,会覆盖原文件中的数据

python manage.py inspectdb >> api/models.py
# 将生成的结果重定向到models.py中,追加到文件中,不会覆盖源文件。

三、同时使用多个数据库

1. 不同app使用不同数据库

数据库路由

  • 如果没有指定路由,则使用默认路由方案—default,确保数据库的检索和保存使用default数据库
  • 如果需要也可以指定路由

a. 配置数据库引擎等相关信息

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'course': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Django',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123456'
    }
}

b. 配置数据库映射

settings.py

DATABASES_APPS_MAPPING = {
    'user': 'default',
    'course': 'course',
}

c.新建一个py文件(db_apps_router.py)

以下文件中的函数名不可修改。

from django.conf import settings


class DatabaseAppsRouter(object):
    def db_for_read(self, model, **kwargs):
        app_label = model._meta.app_label
        print(app_label)
        if app_label in settings.DATABASES_APPS_MAPPING:
            return settings.DATABASES_APPS_MAPPING.get(app_label)
        return None

    def db_for_write(self, model, **kwargs):
        app_label = model._meta.app_label
        if app_label in settings.DATABASES_APPS_MAPPING:
            return settings.DATABASES_APPS_MAPPING.get(app_label)
        return None

    def allow_relation(self, obj1, obj2, **kwargs):
        db_obj1 = settings.DATABASES_APPS_MAPPING.get(obj1._meta.app_label)
        db_obj2 = settings.DATABASES_APPS_MAPPING.get(obj2._meta.app_label)

        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return None

    def db_for_migrate(self, db, app_label, model_name = None, **kwargs):
        if db in settings.DATABASES_APPS_MAPPING.values():
            return settings.DATABASES_APPS_MAPPING.get(app_label) == db
        elif app_label in settings.DATABASES_APPS_MAPPING:
            return False
        return None

d. 再次修改配置文件

settings.py

DATABASE_ROUTERS = ['ManayDB.db_app_router.DatabaseAppsRouter']

e. 数据化迁移

python manage.py makemigrations user  # 指定app的名称
python manage.py migrate --database user  # 指定要同步的数据库

  

2. 同一app使用不同数据库

在设置数据库路由的前提下,设置不同的model的元数据app_label,达到使用不同的路由。

1. user/model.py

from django.db import models


class User(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=32)


class NoN(models.Model):
    acer = models.CharField(max_length=32)

    class Meta:
        app_label = 'course'

2. 数据化迁移

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

 

 

详情请参考官方文档:https://docs.djangoproject.com/en/1.11/ref/databases/

posted @ 2018-01-30 21:07  流星之泪  阅读(291)  评论(0)    收藏  举报