本章主要描述Oracle数据库的配置
其中,主数据库为mysql(即default),次数据库为oracle
1. 添加多数据库的配置文件
# -*- 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):
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None
2. setting.py中添加多数据库配置
SUB_DIR = os.path.basename(os.path.dirname(__file__))
DATABASE_ROUTERS = [
'{}.database_router.DatabaseAppsRouter'.format(SUB_DIR)
]
# app_name,db_name
DATABASE_APPS_MAPPING = {
'xadmin': 'default',
'app_oracle': 'db_oracle',
}
此时,目录层级结构如下:
3. 添加oracle_app,如下图:
其models.py内容如下,app_label指定了该app使用哪个数据库:
from django.db import models
# Create your models here.
class Student(models.Model):
id = models.IntegerField(primary_key=True) # 这里要创建ID
name = models.CharField(max_length=50, verbose_name='姓名')
gender = models.CharField(max_length=10, default='男', choices=(("男", "男"), ("女", "女")), verbose_name='性别')
age = models.IntegerField(default=0, verbose_name='年龄')
createTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
db_table = 'Student'
verbose_name = "学生"
verbose_name_plural = verbose_name
ordering = ['-createTime']
app_label = 'app_oracle'
def __str__(self):
return self.name
adminx.py文件内容如下,目的是让xadmin对其进行管理展示:
from django.contrib import admin
# Register your models here.
import xadmin
from app_oracle.models import Student
class StudentAdmin(object):
# 不显示字段
exclude = ['id']
pass
xadmin.sites.site.register(Student, StudentAdmin)
init.py文件内容如下:
default_app_config = 'app_oracle.apps.AppOracleConfig'
apps.py文件内容如下,注意:这里的orderIndex_=1你要删掉,因为我这里配置的app展示顺序,不删掉会出错:
from django.apps import AppConfig
class AppOracleConfig(AppConfig):
name = 'app_oracle'
verbose_name = 'Oracle模块'
orderIndex_ = 1
4. 创建oralce序列,并设置指定表的使用该序列:
create sequence STUDENT_SEQ
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;
CREATE OR REPLACE TRIGGER " STUDENT_TRI" BEFORE
INSERT ON STUDENT
FOR EACH ROW
BEGIN
SELECT student_seq.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
5. 将相应表同步到数据库
- 数据库表创建(更新)命令:python manage.py makemigrations app_oracle
- 数据库表应用命令:python manage.py migrate --database=db_oracle
6. 打开浏览器,查看该页面,如下图: