python3之Django多数据库

1、定义数据库

在django项目中, 一个工程中存在多个APP应用很常见;有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。在Django的setting中使用DATABASES设置定义数据库,可以将数据库映射到特定的别名字典中;DATABASES定义的是要给嵌套字典,该设置必须配置default默认数据库。默认使用SQLite进行单一数据库设置:
DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.sqlite3‘,
        ‘NAME‘: ‘mydatabase‘,
    }
}

如不使用默认数据库定义可以将默认配置为空字典形式:

‘default‘:{}

(1) DATABASES内部选项:

ATOMIC_REQUESTS:为True时数据库事务包装每个视图,默认为False

AUTOCOMMIT:为False时禁用Django事务管理,默认为True

ENGINE:设置数据库类型

‘django.db.backends.postgresql‘
‘django.db.backends.mysql‘
‘django.db.backends.sqlite3‘
‘django.db.backends.oracle‘

HOST:指定连接的主机名或ip地址,如果使用(‘/’)正斜杠开头则通过套接字连接:

‘HOST‘:‘127.0.0.1‘   #TCP套接字连接
‘HOST‘:‘/var/run/mysql‘   #UNIX套接字

NAME:制定使用的数据库名,对于SQLite它是指定数据库文件的路径,在window上也要使用正斜杠。

‘NAME‘:‘databasename‘
‘NAME‘:‘C:/user/mysite/sqlite3.db‘

CONN_MAX_AGE:数据库连接的生命周期,默认为0请求结束时关闭数据库,设置为None无限持久连接。

OPTIONS:链接到数据库时使用的额外参数,可用参数因数据库类型而异。

‘OPTIONS‘:{‘read_default_file‘:‘path/to/my.cnf‘,} #优先于NAME,USER,PASSWORD,HOST,PORT

#设置mysql启用严格模式
‘OPTIONS‘:{‘init_command‘:"SET sql_mode=‘STRICT_TRANS_TABLES‘"}

PASSWORD:设置密码,不与SQLite一起使用

PORT:指定端口

TIME_ZONE:设置时区

DISABLE_SERVER_SIDE_CURSORS:True时禁用服务器端游标

USER:链接用户名

TEST:测试数据库

(2)自定义数据库

#自定义两个mysql数据库映射到db1和db2上
‘db1‘:{
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘: ‘db1‘,
        ‘USER‘: ‘root‘,
        ‘PASSWORD‘: ‘123.com‘,
        ‘HOST‘: ‘172.16.32.133‘,
        ‘PORT‘: ‘3306‘,
        ‘OPTIONS‘: {
            ‘init_command‘: "SET sql_mode=‘STRICT_TRANS_TABLES‘",
        },   #mysql使用严格模式,不指定会有警告信息
    },
    ‘db2‘:{
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘: ‘db2‘,
        ‘USER‘: ‘root‘,
        ‘PASSWORD‘: ‘123.com‘,
        ‘HOST‘: ‘172.16.32.133‘,
        ‘PORT‘: ‘3306‘,
        ‘OPTIONS‘: {
            ‘init_command‘: "SET sql_mode=‘STRICT_TRANS_TABLES‘",
        }

如果访问没有在DATABASES中定义的数据库,Django会报:django.db.utils.ConnectionDoesNotExist 异常。

2、同步数据库

migrate管理命令会同时在每一个数据库上运行,默认情况下它在default数据库上运行 ,可以通过选项 --database来指定需要同步的数据库。如不指定会同步到default数据库上。

迁移同步命令:

makemigrations:根据简称到的变化创建新的迁移。

migrate:将模型和迁移数据同步到数据库中。

通过上面的列子,将每个应用程序同步到特定的数据库:

#python manage.py migrate   #同步默认数据库#python manage.py migrate --database=db1
#python manage.py migrate --database=db2

多个数据库导出:

python manage.py dumpdata app01 --database=db1 > app1_fixture.json
python manage.py dumpdata app02 --database=db2 > app2_fixture.json
python manage.py dumpdata auth > auth_fixture.json

多个数据库导入:

python manage.py loaddata app1_fixture.json --database=db1
python manage.py loaddata app2_fixture.json --database=db2

3、自动数据库路由

使用多个数据库时最简单的方法是设置数据库路由方案,以保证对象对原始数据库的“粘性",默认所有的查询都会返回到default数据库中。

数据库路由器是一个最多提供四种方法的类:

db_for_read(model,**hints)  :应用于读取类型对象的数据库模型,如果数据库提供附加信息会在hints字典中提供,最后如果没有则返回None

db_for_write(model,**hints):应用于写入类型对象的数据库模型,hints字典提供附加信息,如果没有则返回None

allow_relation(obj1,obj2,**hints):外键操作,判断两个对象之间是否是应该允许关系,是返回True,否则返回False,如果路由允许返回None

allow_migrate(db,app_label,model_name=None,**hints):db确定是否允许在具有别名的数据库上运行迁移操作,操作运行返回True,否则返回False,或者返回None,如果路由器没有意见。

app_label:位置参数是正在迁移的应用程序的标签。

model_name:多个迁移操作设置模型的值,如:model._meta.app_label

(1)定义数据库路由方法类

在项目工程根路径下(与 settings.py 文件一级)创建数据库路由表,app应用会根据指定的路由选择数据库:

app01,app02分别使用db1和db2数据库:

#!/usr/bin/env python
#coding:utf8
from django.conf import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING   #在setting中定义的路由表

class DatabaseAppsRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):

        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):

        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):

        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_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中配置DATABASE_ROUTERS指定自由路由文件:

#test_django为项目名,database_router为路由文件名,DatabaseAppsRouter为路由中创建的类名

DATABASE_ROUTERS = [‘test_django.database_router.DatabaseAppsRouter‘]

在setting.py中DATABASE_ROUTERS下面设置app与数据库匹配路由表,采用字典方式app名对应数据库映射名:

DATABASE_APPS_MAPPING = {
     ‘app01‘:‘db1‘,
     ‘app02‘:‘db2‘,  
 }

(3)生成数据表并同步数据

分别在app01和app02下创建model类,用于生成数据表:

app01:

from django.db import models

# Create your models here.
class ap1(models.Model):
    username = models.CharField(max_length=30)
    class Meta:
        #app_label = ‘app02‘  #如果指定将在app02对应的数据库下创建数据表

class ap2(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

app02:

from django.db import models

class ap3(models.Model):
    app2_name = models.CharField(max_length=50)
    sex = models.CharField(max_length=50)
    data = models.DateField()

class ap4(models.Model):
    app2 = models.CharField(max_length=50)
    sex1 = models.CharField(max_length=50)
    data1 = models.DateField()
    class Meta:
        db_table = ‘mytable‘ #自定义表名称

migrate管理命令一次只能操作一个数据库,默认操作default数据库,使用--database指定同步的数据库:

#python manage.py migrate  #生成表数据同步
#python manage.py makemigrations #创建变动数据
#python manage.py migrate --database=db1 #同步指定数据库
#python manage.py migrate --database=db2

需要注意:在多个app分库时,必须指定每个app对应的数据库,否则在同步数据 库时将没指定的app模板都同步到同步数据库中。

4、手动选择数据库

使用using()指定查询的数据库的别名:

>>> # So will this.
>>> Author.objects.using(‘default‘).all()

>>> # This will run on the ‘other‘ database.
>>> Author.objects.using(‘other‘).all()

保存数据,Model.save()指定将数据保存到哪个数据库中:

>>> my_object.save(using=‘legacy_users‘)

#会将数据保存到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 

--------------------------------------------------------------------------

原文地址:https://www.cnblogs.com/zhangxinqi/p/9094953.html

时间: 2024-10-30 10:12:05

python3之Django多数据库的相关文章

Linux下安装Python3的django并配置mysql作为django默认数据库(转载)

我的操作系统为centos6.5 1  首先选择django要使用什么数据库.django1.10默认数据库为sqlite3,本人想使用mysql数据库,但为了测试方便顺便要安装一下sqlite开发包. yum install mysql mysql-devel #为了测试方便,我们需要安装sqlite-devel包 yum install sqlite-devel 2  接下来需要安装Python了,因为Python3已经成为主流,所以接下来我们要安装Python3,到官网去下载Python3

Python3和Django如何支持MySQL和MariaDB数据库

原文地址:http://www.server110.com/mariadb/201404/10020.html 首先,[email protected] 中默认的引擎为 django.db.backends.mysql .但是在Python3中如果这样写的话,会发现 django.db.backends.mysql 依赖 MySQLdb[5] ,而 MySQLdb 又不兼容 Python3 于是要找一种新的方式来继续使用MySQL. 首先据MySQL文档[3]说,自从MySQL Connecto

python3.4连接mysql数据库的方法

python3.4连接mysql数据库的方法 发布时间:2014-08-04编辑:www.jbxue.com 本文介绍了python3.4连接mysql数据库的方法,在python3.4中不能用mysqldb连接mysql,可以使用pymysql完成连接mysql数据库,需要的朋友参考下. 在python3.4中用原来python2.7的mysqldb已不能连接mysql数据库了. 喜欢mysqldb的朋友,可以参考: Python实例 mysqldb操作数据库 python MySQLdb操作

No module named 'MySQLdb' python3.6 + django 1.10 + mysql 无法连接

学习python 连接mysql数据库的时候遇到了问题 首先安装mysql: 工具栏 ===>file ==> default settings==>Project Interpreter ==> 点击右侧的+ 号==>pymysql==>OK (1) 进入 settings.py==> DATABASES = { 'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'pymysql_test','US

Django ORM 数据库设置和读写分离

一.Django的数据库配置 (一)修改settings.py文件关于数据库的配置: Django默认使用sqlite: # Django默认的数据库库,SQLit配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # sqlite引擎 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } 再添加一个数据库:仿照"default"的格式直接添加: DAT

django之数据库orm

django之数据库orm 一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1>sqlite django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 引擎名称:django.db.backends.sqlite3 <2>mysql 引擎名称:django.db.backends.mysql 2 mysql驱动程序 MySQLdb(mysql python) mysqlclient MySQL P

用python3.x与mysql数据库构建简单的爬虫系统(转)

这是在博客园的第一篇文章,由于本人还是一个编程菜鸟,也写不出那些高大上的牛逼文章,这篇文章就是对自己这段时间学习python的一个总结吧. 众所周知python是一门对初学编程的人相当友好的编程语言,就像本屌丝一样,一学就对它产生好感了!当然,想要精通它还有很多东西需要学习.那废话不多说了,下面我就来说一下如何用python3.x与mysql数据库构建一个简单的爬虫系统(其实就是把从网页上爬下来的内容存储到mysql数据库中). 首先就是搭建环境了,这里就简介绍一下我的环境吧.本机的操作系统是w

Django模型-数据库操作

前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开始,进入到了Django模型,也就是数据库操作. 自带 Sqlite3 数据库查询方式 为了简单,使用Python自带的Sqlite3数据库进行实例说明. 先看一个传统的数据库操作示例: 1 from django.shortcuts import render 2 import sqlite3 3

Django入门 &#160; 数据库的ORM操作之一对多

Django对数据库的是通过ORM实现.什么叫做ORM呢?简单来说,我们通过sql语句查询一张表的所有数据的语句如下  select * from test.而Django中用到的表都是在models.py文件里定义.所以我们要查查询test表里的数据可以通过 test_obj = models.test.objects.all()来获取test表里所有数据的对象.再通过 test_obj.values()方法将每一行数据的里的各个字段以key和value的字典形式读取出来.这就叫ORM操作.