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/