本章主要描述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