Django项目配置连接多个数据库的方法记录

一个APP对应一个默认数据库,若连接其他数据库用".using()"

Author.objects.using('db02').all()

1、在项目settings中增加数据库配置

# settings.py

DATABASES = {
  'default': {
   'ENGINE': 'django.db.backends.oracle',
     'NAME': 'orcl19c',
     'USER': "username01",
     'PASSWORD': "password01",
     'HOST': "110.10.1.11",
     'PORT': 1511,
 },
  'db_2': {
   'ENGINE': 'django.db.backends.oracle',
     'NAME': 'orcl19c',
     'USER': "username02",
     'PASSWORD': "password02",
     'HOST': "120.20.2.22",
     'PORT': 1512,
 }
}
# 以下MyProject改成项目名,默认default不用修改
DATABASE_ROUTERS = ['MyProject.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
    'app01': 'default',
    'app02': 'db_2',
}

2、在项目根目录下Myproject/Myproject 新建数据库路由文件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

3、使用inspectdb反向生成各app的model类之后,配置model类对应要链接的数据库

反向生成models.py 命令:

python manage.py inspectdb --database db1 TableName1 > app01/models.py

python manage.py inspectdb --database db2 TableName2 > app02/models.py
# 编辑app01下的models.py:
class Names(models.Model): #该model使用default数据库
    id=models.CharField(primary_key=True,max_length=100, blank=True, null=True)
    name=models.CharField(max_length=32,primary_key=True,unique=True)

    class Meta:
        #app_label = 'app01' #由于该model连接default数据库,所以在此无需指定
        db_table = 'names'

# 编辑app02下的models.py:
class Classnum(models.Model): #该model使用default数据库
    id=models.CharField(primary_key=True,max_length=100, blank=True, null=True)
    classnum=models.CharField(max_length=32,primary_key=True,unique=True)

    class Meta:
        app_label = 'app02'
        db_table = 'classnum'

 4、同步数据库

# 同步default节点数据库,只运行不带 --database参数的命令,不对其他数据库进行同步

python manage.py makemigrations

python manage.py migrate

# 同步db02节点数据库:

python manage.py makemigrations

python manage.py migrate --database=db02

5、若要连接配置外的数据库

Author.objects.using('other').all()
my_object.save(using='legacy_users')
my_object.delete(using='legacy_users')

移动对象到另一个数据库时会发生主键冲突,可以使用obj.pk方法清除主键再保存对象

>>> p = Person(name='Fred')
>>> p.save(using='first')
>>> p.pk = None # Clear the primary key.
>>> p.save(using='second') # Write a 

总结

到此这篇关于Django项目配置连接多个数据库的文章就介绍到这了,更多相关Django配置连接多数据库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • django如何连接已存在数据的数据库

    你有没有遇到过这种情况? 数据库,各种表结构已经创建好了,甚至连数据都有了,此时,我要用Django管理这个数据库,ORM映射怎么办??? Django是最适合所谓的green-field开发,即从头开始一个新的项目 但是呢,Django也支持和以前遗留的数据库和应用相结合的. Django的数据库层从Python代码生成SQL schemas.但是对于遗留的数据库,你已经用于SQL schemas,这种情况下你需要为你已经存在的数据库表写模型(为了使用数据库的API),幸运的是,Django自

  • python Django连接MySQL数据库做增删改查

    1.下载安装MySQLdb类库http://www.djangoproject.com/r/python-mysql/2.修改settings.py 配置数据属性 复制代码 代码如下: DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.        'NAME': 'djang

  • 使用Django连接Mysql数据库步骤

    链接mysql步骤 第一步:在终端下载pymysql文件–pip install pymysql 第二步:在gjango项目的__init__文件中添加代码 import pymysql pymysql .install_as_MySQLdb() 第三步:找到mysql的连接源,然后填信息,如果没有mysql驱动,需要下载MySQL驱动 mysql的配置:进入settings文件中找到DATABASES配置信息 DATABASES = { 'default': { 'ENGINE': 'djan

  • Django数据库连接丢失问题的解决方法

    问题 在Django中使用mysql偶尔会出现数据库连接丢失的情况,错误通常有如下两种 OperationalError: (2006, 'MySQL server has gone away') OperationalError: (2013, 'Lost connection to MySQL server during query') 查询mysql全局变量SHOW GLOBAL VARIABLES;可以看到wait_timeout,此变量表示连接空闲时间.如果客户端使用一个连接查询多次数

  • Django项目配置连接多个数据库的方法记录

    一个APP对应一个默认数据库,若连接其他数据库用".using()" Author.objects.using('db02').all() 1.在项目settings中增加数据库配置 # settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.oracle', 'NAME': 'orcl19c', 'USER': "username01", 'PASSWORD': "pass

  • Spring MVC配置双数据源实现一个java项目同时连接两个数据库的方法

    前言 本文主要介绍的是关于Spring MVC配置双数据源实现一个java项目同时连接两个数据库的方法,分享出来供大家参考学习,下面来看看详细的介绍: 实现方法: 数据源在配置文件中的配置 <pre name="code" class="java"><?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spring

  • Django+mysql配置与简单操作数据库实例代码

     第一步:下载mysql驱动 cmd进入创建好的django项目目录:使用命令 pip install mysqlclient 等待安装成功! 第二步:在settings.py中配置mysql连接参数(没有mysql的先装mysql) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名(你得先在mysql中创建数据库)', 'USER':'mysql用户名(如root)', 'PASSWOR

  • Django 项目配置拆分独立的实现

    目录 一.创建配置目录 二.创建基础配置文件 三.创建各个环境的配置 四.调整settings.py 五.程序使用 六.目录结构 Django 项目中,我们默认的配置是都在 settings.py 文件里面的,但是实际本地调试和线上应该是需要两个环境的,我们现在来拆分下配置.将配置拆分开来. 一.创建配置目录 我们在项目的跟路径下创建一个config 目录 二.创建基础配置文件 在config 配置下 创建 base.py 文件,然后将原来 settings.py 文件内容拷贝过来. 三.创建各

  • SpringBoot连接使用PostgreSql数据库的方法

    一.介绍 此次更新时间:2020-10-28,现在是上班时间,偷更一下.其实使用IDEA的话无需配置Maven什么的,如果你们公司不是强制要求使用Eclipse的话,只需要有个JDK的环境即可,IDEA自带了一个版本的Maven,还是挺新的,目前IDEA最新版2.2.3的版本.我们也不用按照下面这个步骤去下载Spring Initializr,我们在IDEA中新建项目选择到Maven就行了,干净简洁. 目前在Resources目录下的application大多数是使用yml语法了.现在已经太长时

  • 让Django支持Sql Server作后端数据库的方法

    好久木有在windows里面写python了..这本也不是事儿,python嘛,只要系统里面装好了,那大多数代码都是可以正常运行的..然而有时候需要调用微软那一套特定的API,什么Java啊python啊总有水土不服的时候. 今天我就将我在Mac里面写好的Django项目移到win10上.一开始图省事儿,我用的sqlite3当后端数据库,但单位要求在项目正式上线的时候用SQL Server,于是,记得django 1.9默认不支持微软那一套的我,就开始在网上搜啊搜,现是发现有人说只要装好一个名为

  • 通过 plsql 连接远程 Oracle数据库的方法

    方法一:通过 plsql 工具和 oracle client(不是即时客户端 instantclient) 的方式来连接 Oracle 一. 安装 oracle client,(本教程已经下载并解压) 二. 选 择 管 理 员 安 装 ,如图: 三.剩下的就是一路下一步就 OK,安装完成后在 doc 窗口执行,sqlplus 如 果 出 现 如 下 输 入 用户名 , 就 表 示 安 装 成 功 四.安装 plsql(本教程 Oracle 为 11gr2,所以 plsql 也安装了版本 11,其

  • PHP中用mysqli面向对象打开连接关闭mysql数据库的方法

    如下所示: 代码如下: <meta http-equiv="content-type" content="text/html" charset="utf-8"/> <h1>用mysqli面向对象方法连接数据库!-姚远的博客</h1> <form method="POST" action="<?php echo htmlspecialchars($_SERVER['PHP

  • jsp简单连接SQL Server2000数据库的方法

    本文实例讲述了jsp简单连接SQL Server2000数据库的方法.分享给大家供大家参考.具体如下: package util; import java.sql.Connection; import java.sql.DriverManager; public class ConnDB { public static String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"; public static String u

  • C#实现异步连接Sql Server数据库的方法

    本文实例讲述了C#实现异步连接Sql Server数据库的方法.分享给大家供大家参考.具体分析如下: .net最新版提供了await方法,可以使我们可以很容易实现到数据库的异步连接 复制代码 代码如下: readonly string ConnectionString = "Data Source=database_server_name;Initial Catalog=Store;Integrated Security=True"; protected async void Exec

随机推荐