天天看點

Django+xadmin+rules 靜态多資料庫開發 第二章

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

此時,目錄層級結構如下:

Django+xadmin+rules 靜态多資料庫開發 第二章

3. 添加oracle_app,如下圖:

Django+xadmin+rules 靜态多資料庫開發 第二章

其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. 打開浏覽器,檢視該頁面,如下圖:

Django+xadmin+rules 靜态多資料庫開發 第二章