zoukankan      html  css  js  c++  java
  • django的多数据库的操作

    1.项目目录

      在存在两个app的时候使用两个数据

        

    2.model类

    app02/models.py

        在使用多数据库的时候,我们要到每个表的下面使用[app_label=app的名字],示例如下

    class Publish(models.Model):
        name=models.CharField(max_length=32)
        email=models.EmailField()
    
    
        def __str__(self):
            return "app02 %s" % self.name
    
        class Meta:
        #app的名字 app_label = 'app02'

     3.settings的写法

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'orm',  ## 数据库名称
            'USER': 'root',
            'PASSWORD': '123456',  ## 安装 mysql 数据库时,输入的 root 用户的密码
            'HOST': '127.0.0.1',
        },
        'mysql02': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'orm02',  ## 数据库名称
            'USER': 'root',
            'PASSWORD': '123456',  ## 安装 mysql 数据库时,输入的 root 用户的密码
            'HOST': '127.0.0.1',
        },
    }
    
    # 多数据库连接池
    DATABASE_ROUTERS = ['djangoser.database_router.DatabaseAppsRouter']
    # 配置app与之相对应的连接池
    DATABASE_APPS_MAPPING = {
        'app01': 'default',
        'app02': 'mysql02',
    

     4.在同级目录下添加database_router.py

    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
    
        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
    
        def allow_migrate(self, db, app_label, model=None, **hints):
            """
            Make sure the auth app only appears in the 'auth_db'
            database.
            """
            if db in DATABASE_MAPPING.values():
                return DATABASE_MAPPING.get(app_label) == db
            elif app_label in DATABASE_MAPPING:
                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):
            print(db, app_label, model_name, hints)
            if db in DATABASE_MAPPING.values():
                return DATABASE_MAPPING.get(app_label) == db
            elif app_label in DATABASE_MAPPING:
                return False
            return None
    

     5.执行命令

    python manage.py makemigrations
    --database指定要加载那个modles
    python manage.py migrate --database=app02
    #这样生成的数据库前缀app02_xxx
  • 相关阅读:
    SAMBA服务初学练习
    NFS与AutoNFS实例
    NTP服务简介
    DHCP服务简单搭建步骤
    HBase文档操作--练习篇
    Hadoop体系结构管理
    HBase表结构设计--练习篇
    HBase备份恢复练习
    MongoDB管理练习
    24_BlockingQueue接口
  • 原文地址:https://www.cnblogs.com/xzcvblogs/p/12310266.html
Copyright © 2011-2022 走看看