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
  • 相关阅读:
    【C++、回溯】LeetCode52. N皇后 II
    【C++、回溯】LeetCode39. 组合总和
    递归方法和回溯方法模板
    【C++】LeetCode面试题 08.06. 汉诺塔问题
    【C++、快速排序巧用】LeetCode215 数组中的第K个最大元素
    【multimap在文件处理中显奇效】将文本文件的每行内容,按照行首6个数字的升序,重新排序
    【C++、partition】快速排序算法实现
    【C++】归并排序实现
    【C++】LeetCode147 对链表进行插入排序
    更换与还原Android Studio的主题
  • 原文地址:https://www.cnblogs.com/xzcvblogs/p/12310266.html
Copyright © 2011-2022 走看看