Django1.11.11配置多数据库

1、安装PyMySQL、psycopg2
pip install PyMySQL      # 用于MySQL数据库交互
pip install psycopg2     # 用于PostgreSQL数据库交互
2、修改项目(Project01)同名目录下的 init.py 文件
import pymysql

pymysql.install_as_MySQLdb()
3、修改 settings.py 文件
DATABASES = {
    # 要求default 数据库必须定义
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',  # 引擎
        'HOST': '192.168.1.200',                             # IP
        'PORT': '5432',                                      # 端口
        'USER': 'tiger',                                     # 用户名
        'PASSWORD': '123456',                                # 用户密码
        'NAME': 'tigerdb',                                   # 数据库名
    },
    'database01': {
        'ENGINE': 'django.db.backends.mysql',                # 引擎
        'HOST': '192.168.1.100',                             # IP
        'PORT': 3306,                                        # 端口
        'USER': 'tiger',                                     # 用户名
        'PASSWORD': '123456',                                # 用户密码
        'NAME': 'tigerdb'                                    # 数据库名
    },
}

DATABASE_ROUTERS = ['Project01.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
    # 'app01': 'default'  # 可以不指定 ,不指定的app,默认数据库为'default'数据库
    'app02': 'database01',  # 'app名字': '数据库名字'
}
4、数据库路由
  • 项目同名目录Project01/Project01下新建一个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 = {'app01': 'default', 'app02': 'db02'}
        """
    
        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、编写 models.py 文件
  • 使用默认数据库的app,models.py 编写,不需要指定app_label
    class Reader(models.Model):
        name=models.CharField(max_length=32,primary_key=True,unique=True)
        age = models.CharFieid()
    
        def __str__(self):
            return self.name
    
        class Meta:
            # app_label = 'app01' # 由于该model连接default数据库,所以在此无需指定
            db_table = 'tb_reader'  # 指定生成数据库的表名称
            verbose_name = '读者'
        	verbose_name_plural = verbose_name
    
  • 使用指定数据库的app,models.py 编写
    class Author(models.Model):
        name=models.CharField(max_length=32,primary_key=True,unique=True)
        age = models.CharFieid()
    
        def __str__(self):
            return self.name
    
        class Meta:
            app_label = 'app02'  # 定义该model的app_label
            db_table = 'tb_author'  # 指定生成数据库的表名称
            verbose_name = '作者'
        	verbose_name_plural = verbose_name
    
6、同步数据库
  • 同步default数据库,只运行不带 --database参数的命令,不对其他数据库进行同步
    python manage.py makemigrations
    python manage.py migrate
    
  • 同步database01数据库
    python manage.py makemigrations
    python manage.py migrate --database=database01
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值